我可以将"this"传递给Q_Slot吗?



我有一个带有许多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。您指的是thisQObject::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>();
  /*...*/
}

相关内容

  • 没有找到相关文章

最新更新