首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我能把“这个”传递给Q_Slot吗?

我能把“这个”传递给Q_Slot吗?
EN

Stack Overflow用户
提问于 2017-02-16 14:10:28
回答 2查看 156关注 0票数 0

我有一个有许多窗口(QWidgets)的应用程序。不过,我没有保存打开窗口的列表,所以每次我想关闭窗口时,我都必须检索它。

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

我有两个计划。1)通过添加SubWindow构造函数从内部销毁SubWindow

代码语言:javascript
代码运行次数:0
运行
复制
connect(sEditors, SIGNAL(closeWindow()),
        this, closeWindow()));

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

代码语言:javascript
代码运行次数:0
运行
复制
connect(sEditors, SIGNAL(closeWindow()),
        main, SLOT(closeWindow(this)));

大约1),我不明白如何从内部关闭和销毁一个QWidget (删除它,似乎不起作用,但我可以再试一次)。

大约2)我的插槽(closeWindow(这个))似乎没有被触发,所以我想知道我是否可以传递“这个”作为一个参数。

EN

回答 2

Stack Overflow用户

发布于 2017-02-16 14:18:52

广告1)你可以使用QObject::deleteLater()。这将在下一个事件循环循环中销毁该对象,并专门为以下情况创建

广告2)不能将实际参数作为信号插槽连接中的参数传递.但是,您可以通过使用插槽中的sender()函数来找出谁发出了信号。在您的示例中,这将是sEditors对象。

其他备选方案:

3)您可以使用QSignalMapper将信号从编辑器映射到子窗口。

4) (使用Qt5 / C++11)您可以在子窗口中使用lambda连接:

代码语言:javascript
代码运行次数:0
运行
复制
connect(sEditors, SIGNAL(closeWindow()), [this] () {this->closeWindow();});
票数 0
EN

Stack Overflow用户

发布于 2017-02-16 14:25:59

我能把this传递给Qt插槽吗?

插槽是一种非静态方法,因此它已经可以访问this.您所指的thisQObject::connect的第三个参数。在Qt4语法中,您可以省略第三个参数--它默认为this。但是,在Qt 5语法中,您必须明确地说明这一点。

我不明白我怎么能从内部关闭和摧毁QWidget

若要从内部删除任何QObject,请使用QObject::deleteLater()。回想一下,从QWidget的角度来说,QObject就是-- LSP

我的插槽(closeWindow(这个))似乎没有被触发

没有这样的插槽(给我们一个指向它的文档的链接:您不能),而且您的时隙签名也是无效的,因为插槽签名中括号中唯一的东西可以是类型,而且this不是类型:SLOT(slotName(TYPE_LIST_HERE)),例如SLOT(mySlot(int,QString))

若要关闭小部件,请使用其close()插槽:

代码语言:javascript
代码运行次数:0
运行
复制
connect(sEditors, SIGNAL(closeWindow()), this, SLOT(close());

然而,通过使用Qt4 connect语法,将代码错误留给运行时检测--如果您不注意运行时的调试输出,就会错过它。因此,使用新的(Qt 5) connect语法并让编译器为您检测错误要好得多:

代码语言:javascript
代码运行次数:0
运行
复制
connect(sEditors, &MultiEditor::closeWindow, this, &QWidget::close); 

唉,没有必要将发送closeWindowSubWindow的对象紧密耦合--至少在SubWindow::SubWindow()中不需要。相反,您可以在创建编辑器的位置进行连接。

若要在小部件关闭时删除它,只需在其上设置Qt::WA_DeleteOnClose属性,让Qt为您完成此操作。不需要显式调用deleteLater等。

您可以将所有这些因素都考虑到工厂方法中:

代码语言:javascript
代码运行次数:0
运行
复制
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>();
  /*...*/
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42276308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档