我有一个包含许多窗口的应用程序(QWidgets)。 但是,我没有保存打开的窗口列表,因此每次我要关闭窗口时,都必须检索它。
特别是,这些窗口中的每一个都在这里被称为 SubWindow 。 每个SubWindow类都包含一个带有MultiEditor * sEditors的布局,该布局包含一个菜单,其中包含一个关闭当前窗口的操作。 每个SubWindow都在MainWindow中创建。
我有两个计划。 1)通过在SubWindow构造函数中添加
来从内部销毁SubWindowangular.mock.inject()
或
2)通过在SubWindow构造函数中添加来从MainWindow类中销毁SubWindow
connect(sEditors, SIGNAL(closeWindow()),
this, closeWindow()));
关于1),我不明白如何从内部关闭和销毁QWidget(删除它; 似乎没有用,但我可以再试一次)。
关于2)我的SLOT(closeWindow(this))似乎没有被触发,所以我想知道我是否可以通过"这个"作为一个论点。
答案 0 :(得分:0)
广告1)您可以使用QObject::deleteLater()
。这将在下一个事件循环周期中销毁对象,并专门为此类情况创建
Ad 2)您不能将实际参数作为参数传递给信号槽连接。
但是,您可以使用插槽中的sender()
功能找出谁发出了信号。在您的情况下,那将是sEditors
对象。
其他选择:
3)您可以使用QSignalMapper
将编辑器中的信号映射到Subwindows。
4)(使用Qt5 / C ++ 11)您可以在Subwindows中使用lambda连接:
connect(sEditors, SIGNAL(closeWindow()), [this] () {this->closeWindow();});
答案 1 :(得分:0)
我可以将
this
传递到Qt广告位吗?
广告位是非静态方法,因此它已经可以访问this
。您引用的this
是QObject::connect
的第三个参数。在Qt 4语法中,您可以自由省略第三个参数 - 它默认为this
。在Qt 5语法中,你必须明确它。
我不明白如何从内部关闭和销毁QWidget
要从内部删除任何QObject
,请使用QObject::deleteLater()
。回想QWidget
就LSP而言QObject
是this
。
我的SLOT(closeWindow(this))似乎没有被触发
没有这样的插槽(给我们链接到它的文档:你不能),你的插槽签名也是无效的,因为插槽签名中括号内的唯一内容可以是类型,并且SLOT(slotName(TYPE_LIST_HERE))
不是类型:SLOT(mySlot(int,QString))
,例如close()
。
要关闭窗口小部件,请使用其connect(sEditors, SIGNAL(closeWindow()), this, SLOT(close());
插槽:
connect
然而,通过使用Qt 4 connect
语法,您可以在运行时检测到编码错误 - 然后如果您在运行时没有注意调试输出,那么您#&# 39;我会想念它。因此,使用新的(Qt 5)connect(sEditors, &MultiEditor::closeWindow, this, &QWidget::close);
语法会更好,并让编译器为您检测错误:
closeWindow
唉,没有必要将发送SubWindow
的对象紧密耦合到SubWindow::SubWindow()
- 至少不在Qt::WA_DeleteOnClose
内。相反,您可以在创建编辑器的位置进行连接。
要在窗口小部件关闭时删除它,只需在其上设置deleteLater
属性,让Qt为您完成。无需明确调用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>();
/*...*/
}
等。
您可以将所有这些因素都计入工厂方法:
await