我有一个有许多窗口(QWidgets)的应用程序。不过,我没有保存打开窗口的列表,所以每次我想关闭窗口时,我都必须检索它。
特别是,这些窗口中的每一个都在这里称为SubWindow。每个SubWindow类都包含一个带有MultiEditor *sEditors的布局,其中有一个带有关闭当前窗口的操作的菜单。每个SubWindow都是在MainWindow中创建的。
我有两个计划。1)通过添加SubWindow构造函数从内部销毁SubWindow
connect(sEditors, SIGNAL(closeWindow()),
this, closeWindow()));
或
2)通过添加SubWindow构造函数,从MainWindow类中销毁SubWindow
connect(sEditors, SIGNAL(closeWindow()),
main, SLOT(closeWindow(this)));
大约1),我不明白如何从内部关闭和销毁一个QWidget (删除它,似乎不起作用,但我可以再试一次)。
大约2)我的插槽(closeWindow(这个))似乎没有被触发,所以我想知道我是否可以传递“这个”作为一个参数。
发布于 2017-02-16 06:18:52
广告1)你可以使用QObject::deleteLater()
。这将在下一个事件循环循环中销毁该对象,并专门为以下情况创建
广告2)不能将实际参数作为信号插槽连接中的参数传递.但是,您可以通过使用插槽中的sender()
函数来找出谁发出了信号。在您的示例中,这将是sEditors
对象。
其他备选方案:
3)您可以使用QSignalMapper
将信号从编辑器映射到子窗口。
4) (使用Qt5 / C++11)您可以在子窗口中使用lambda连接:
connect(sEditors, SIGNAL(closeWindow()), [this] () {this->closeWindow();});
发布于 2017-02-16 06:25:59
我能把
this
传递给Qt插槽吗?
插槽是一种非静态方法,因此它已经可以访问this
.您所指的this
是QObject::connect
的第三个参数。在Qt4语法中,您可以省略第三个参数--它默认为this
。但是,在Qt 5语法中,您必须明确地说明这一点。
我不明白我怎么能从内部关闭和摧毁QWidget
若要从内部删除任何QObject
,请使用QObject::deleteLater()
。回想一下,从QWidget
的角度来说,QObject
就是-- LSP。
我的插槽(closeWindow(这个))似乎没有被触发
没有这样的插槽(给我们一个指向它的文档的链接:您不能),而且您的时隙签名也是无效的,因为插槽签名中括号中唯一的东西可以是类型,而且this
不是类型:SLOT(slotName(TYPE_LIST_HERE))
,例如SLOT(mySlot(int,QString))
。
若要关闭小部件,请使用其close()
插槽:
connect(sEditors, SIGNAL(closeWindow()), this, SLOT(close());
然而,通过使用Qt4 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>();
/*...*/
}
https://stackoverflow.com/questions/42276308
复制相似问题