我可以通过"这个"到Q_Slot?

时间:2017-02-16 14:10:29

标签: qt signals-slots qwidget

我有一个包含许多窗口的应用程序(QWidgets)。 但是,我没有保存打开的窗口列表,因此每次我要关闭窗口时,都必须检索它。

特别是,这些窗口中的每一个都在这里被称为 SubWindow 。 每个SubWindow类都包含一个带有MultiEditor * sEditors的布局,该布局包含一个菜单,其中包含一个关闭当前窗口的操作。 每个SubWindow都在MainWindow中创建。

我有两个计划。 1)通过在SubWindow构造函数中添加

来从内部销毁SubWindow
angular.mock.inject()

2)通过在SubWindow构造函数中添加来从MainWindow类中销毁SubWindow

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

关于1),我不明白如何从内部关闭和销毁QWidget(删除它; 似乎没有用,但我可以再试一次)。

关于2)我的SLOT(closeWindow(this))似乎没有被触发,所以我想知道我是否可以通过"这个"作为一个论点。

2 个答案:

答案 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。您引用的thisQObject::connect的第三个参数。在Qt 4语法中,您可以自由省略第三个参数 - 它默认为this。在Qt 5语法中,你必须明确它。

  

我不明白如何从内部关闭和销毁QWidget

要从内部删除任何QObject,请使用QObject::deleteLater()。回想QWidgetLSP而言QObjectthis

  

我的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