2017-02-16 8 views
0

У меня есть приложение со многими окнами (QWidgets). Я не сохранил список открытых окон, поэтому каждый раз, когда я хочу закрыть окно, я должен его восстановить.Могу ли я передать «это» Q_Slot?

В частности, каждое из этих окон называется здесь SubWindow. Каждый класс SubWindow содержит макет с MultiEditor * sEditors, в котором есть меню с действием, которое закрывает текущее окно. Каждый SubWindow создается внутри MainWindow.

У меня есть два плана. 1) уничтожение подокна из внутри себя, путем добавления в конструктор подокне

connect(sEditors, SIGNAL(closeWindow()), 
     this, closeWindow())); 

или

2) уничтожение подокна из класса MainWindow, путем добавления в конструктор подокне

connect(sEditors, SIGNAL(closeWindow()), 
     main, SLOT(closeWindow(this))); 

Около 1), я не понимаю, как я могу закрыть и уничтожить QWidget изнутри себя (удалить это;, похоже, не работает, но я могу попробовать еще раз).

Около 2) мой SLOT (closeWindow (this)), похоже, не срабатывает, поэтому мне интересно, могу ли я передать «это» в качестве аргумента.

ответ

0

Объявление 1) Вы можете использовать QObject::deleteLater(). Это уничтожит объект в следующем цикле цикла событий и специально создаст для таких ситуаций

Объявление 2) Вы не можете передавать фактические аргументы в качестве параметров в соединениях с сигнальным слотом. Вы также можете узнать, кто выбрал сигнал, используя функцию sender() в слот. В вашем случае это будет объект sEditors.

Других варианты:

3) Вы можете использовать QSignalMapper для отображения сигналов от ваших редакторов к подокнам.

4) (Использование Qt5/C++ 11) Вы можете использовать соединение лямбды в подокне:

connect(sEditors, SIGNAL(closeWindow()), [this]() {this->closeWindow();}); 
+0

По какой-то причине (что я не знаю), моя deleteLater() не работает. Я запускаю его в моем closeWindow(), и мой QWidget остается -> он не исчезает. QWidget не исчезает, даже если я пишу close() [или this-> close()] или hide() [this-> hide()] –

+0

Кажется, вы закрываете/удаляете/скрываете неправильный виджет. Убедитесь, что 'this' указывает на правильный объект в вашем слоте с вашим отладчиком –

+0

Очень хорошо, спасибо! –

0

Могу ли я передать this в слот Qt?

Разъем нестационарный, поэтому он уже имеет доступ к this. Вы ссылаетесь на третий аргумент QObject::connect. В синтаксисе Qt 4 вы можете опустить третий аргумент - по умолчанию он равен this. Однако в синтаксисе Qt 5 вы должны быть явным.

Я не понимаю, как я могу закрыть и уничтожить QWidget изнутри самой

Чтобы удалить какой-либо из QObject внутри себя, используйте QObject::deleteLater(). Напомним, что QWidget является -QObject в терминах LSP.

моего SLOT (CloseWindow (это)) не кажется, срабатывает

Там нет такого слота (дайте нам ссылку на его документацию, вы не можете), и ваш слот подпись также является недопустимым, поскольку в круглых скобках в сигнатуре слота единственные объекты могут быть типами, а this не является типом: SLOT(slotName(TYPE_LIST_HERE)), например SLOT(mySlot(int,QString)).

Чтобы закрыть виджет, использовать его close() слот:

connect(sEditors, SIGNAL(closeWindow()), this, SLOT(close()); 

Тем не менее, с помощью Qt 4 connect синтаксис, вы уезжаете ошибки кодирования, которые будут обнаружены во время выполнения - а затем, если вы не платите внимание к выходу отладки во время выполнения, вы пропустите его. Это, таким образом, гораздо лучше использовать новый (Qt 5) connect синтаксис, и пусть компилятор обнаруживает ошибки для вас:

connect(sEditors, &MultiEditor::closeWindow, this, &QWidget::close); 

Увы, нет необходимости плотно пару объекта, который посылает closeWindow к SubWindow - по крайней мере, в пределах SubWindow::SubWindow(). Вместо этого вы можете подключиться в том месте, где вы создаете редактор.

Чтобы удалить виджет, когда он закрыт, просто установите для него атрибут Qt::WA_DeleteOnClose и пусть Qt сделает это за вас. Нет необходимости явно вызывать deleteLater и т.д.

Вы могли бы учитывать все это в фабричный метод:

template <class T> T* SubWindow::makeEditor() { 
    auto sub = new T{this}; 
    sub->setAttribute(Qt::WA_DeleteOnClose); 
    connect(sEditor, &MultiEditor::closeWindow, sub, &QWidget::close); 
    return sub; 
} 

MainWindow::MainWindow(/*...*/) : /*...*/ { 
    makeEditor<EditorType1>(); 
    makeEditor<EditorType2>(); 
    /*...*/ 
} 
+0

Синтаксис Qt5 очень полезен, спасибо! По какой-то причине (я не знаю) мой deleteLater() не работает. Я запускаю его в моей функции closeWindow(), и мой QWidget остается -> он не исчезает. QWidget не исчезает, даже если я пишу close() [или this-> close()] или hide() [this-> hide()], и если я пишу connect (sEditors, & MultiEditor :: closeWindow, & QWidget :: близко); –

Смежные вопросы