我有一个带有许多Windows(Qwidgets)的应用程序。不过,我没有保存打开窗口的列表,所以每次我要关闭窗口时,都必须检索它。
尤其是,这些窗口中的每个窗口都称为 subwindow 。每个子窗口类都包含一个带有多层 *Seditors的布局,该菜单的菜单带有一个关闭当前窗口的操作。每个子窗都在MainWindow中创建。
我有两个计划。1)通过添加子窗构造函数
来销毁子窗户的内部。connect(sEditors, SIGNAL(closeWindow()),
this, closeWindow()));
或
2)通过添加子窗件构造函数
从Mainwindow类中销毁子窗口connect(sEditors, SIGNAL(closeWindow()),
main, SLOT(closeWindow(this)));
大约1),我不明白如何从内部关闭和销毁Qwidget(删除此; 似乎不起作用,但是我可以再次尝试)。
大约2)似乎没有触发我的插槽(CloseWindow(this)),所以我想知道我是否可以通过"此"作为参数。
ad 1)您可以使用QObject::deleteLater()
。这将在下一个事件循环周期中销毁对象,并专门为这样的情况创建
ad 2)您不能将实际参数作为信号插槽连接中的参数传递。但是,您可以通过在插槽中使用sender()
函数来确定谁发出了信号。就您而言,那将是sEditors
对象。
其他选项:
3)您可以使用 QSignalMapper
将编辑器的信号映射到子窗口。
4)(使用QT5/C 11)您可以在子窗中使用Lambda连接:
connect(sEditors, SIGNAL(closeWindow()), [this] () {this->closeWindow();});
我可以将
this
传递到QT插槽吗?
插槽是一种非静态方法,因此它已经可以访问this
。您指的是this
是QObject::connect
的第三个参数。在QT 4语法中,您可以自由省略第三个参数 - 默认为this
。在QT 5语法中,您必须对此表示明确。
我不明白我如何关闭和销毁Qwidget
要从内部删除任何QObject
,请使用QObject::deleteLater()
。回想一下QWidget
IS-A QObject
根据LSP
我的插槽(CloseWindow(this))似乎没有触发
没有这样的插槽(为我们提供了其文档的链接:您不能),并且您的插槽签名也无效,因为插槽签名中括号中唯一的东西可以是类型,而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);
a,无需紧紧搭配将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>();
/*...*/
}