LINUX.ORG.RU

Qt логика использования QMidArea


0

2

Пока в тестовом примере пробую так распознать тот документ слот которого нужно вызвать:

в конструкторе главного окна приложения

  ws = new QMdiArea;
  setCentralWidget(ws);
  DocWindow* dw     = new DocWindow;
  ws->addSubWindow(dw);
  connect(pactSave,SIGNAL(triggered()),this,SLOT(slotSave()));
  DocWindow* dw2     = new DocWindow;
  ws->addSubWindow(dw2);
  ws->setActiveSubWindow(qobject_cast<QMdiSubWindow*>(dw2));

реализация слота slotSave

void MDIProgram::slotSave(){
  DocWindow* cw = qobject_cast<DocWindow*>(ws->activeSubWindow());
  if(cw) {
     cw->slotSave();
  } else {
     std::cerr << "no active sub win \n";
  }
}

указатель cw содержит ноль, т.к. в консоле печатается no active sub wn.

Что делаю не так?



Последнее исправление: scireseacher (всего исправлений: 1)

Ты бы на типы функций посмотрел, а не только на названия.

DocWindow* cw = qobject_cast<DocWindow*>(ws->activeSubWindow());

auto asw = ws->activeSubWindow();
DocWindow* cw;
if (asw and (cw = qobject_cast<DocWindow*>(asw->widget())) ...

Что делаю не так?

Не читаешь документацию или не пытаешься её понять.

Begemoth ★★★★★
()
Ответ на: комментарий от DELIRIUM

А поподробнее можно? Я лично не понял, что именно не так с QMdiArea.

MDI устарел еще лет 10 назад. Сейчас вместо него используют tabbed интерфейс.

Pavval ★★★★★
()

daris

Я, соответственно, им следую, всё идёт гладко, но в какой-то момент оказывается что фреймворк не предусматривает одну мелочь, и тут остаётся только писать свои обёртки. В рамках архитектуры приходится крутиться.

Пробовал читать всякие Code Complete, книги по паттернам, книги по ООП?

anonymous
()

раз:

  ws = new QMdiArea;
  setCentralWidget(ws);
  DocWindow* dw     = new DocWindow;
  QMdiSubWindow* subWindow1 = ws->addSubWindow(dw);
  connect(pactSave,SIGNAL(triggered()),this,SLOT(slotSave()));
  DocWindow* dw2     = new DocWindow;
  QMdiSubWindow* subWindow2 = ws->addSubWindow(dw2);
  ws->setActiveSubWindow(subWindow2);

два:
void MDIProgram::slotSave(){
  DocWindow* cw = qobject_cast<DocWindow*>(ws->activeSubWindow()->widget());
  if(cw) {
     cw->slotSave();
  } else {
     std::cerr << "no active sub win \n";
  }
}

dt1 ★★
()
Ответ на: комментарий от Pavval

> MDI устарел еще лет 10 назад. Сейчас вместо него используют tabbed интерфейс.

Внезапно: QMdiArea::setViewMode(QMdiArea::TabbedView)

dt1 ★★
()
Ответ на: комментарий от scireseacher

Дык он же сказал - тем самым QMdiArea, только надо задать setViewMode(QMdiArea::TabbedView).

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.