c++ - 使用全局 QObject 进行交叉信号/插槽转发是正确的方法
问题描述
我的情况是,一个有很多 QWidget 通信需求的大型 Qt 项目。
例如,我有一个 QPushButton B和一个 QLabel L,我需要单击按钮B以在标签L上显示一些文本或隐藏它等。但问题是它们都无法获取彼此的对象指针,因为两者它们中的一部分位于一棵很深的 QWidget 树中,也许它们的祖祖父小部件是兄弟姐妹,不管怎样。
所以我的选择是创建一个全局唯一的 QObject,仅用于单/插槽转发,如下所示:
class GlobalForward: public QObject
{
Q_OBJECT
public:
GlobalForward():QObject(null) {}
signal:
void SigForwardButton(bool toggle);
}
GlobalForward* gForwardObj;
int main(int argc, char* argv[])
{
QApplication app(argc, argv[]);
gForwardObj = new GlobalForward();
QWidget w;
QPushButton* button = new QPushButton(&w);
QWidget m;
QLabel* label = new QLabel(&m);
w.show();
m.show();
connect(button, &QPushButton::clicked, gForwardObj, &GlobalForward::SigForwardButton);
connect(gForwardObj, &GlobalForward::SigForwardButton, label, &QWidget::hide);
return app.exec();
}
实际上,按钮和标签相距甚远,彼此看不到。我想使用GlobalForward连接信号以使其工作。此外,它可以类似地转发 QEvent。
我想知道的是,这种方式是否很好地解决了我的问题,它的缺点是什么。另外,任何更好的解决方案都是合适的,谢谢。
解决方案
推荐阅读
- windows-10 - IE11 打开 F12 JIT 异常
- javascript - 改变给定句子关键字的颜色
- python - 使用 flask_mongoengine 检查数据库连接
- google-chrome - 向 chrome.downloads.download api 添加额外的标头
- java - 在多个服务器地址上运行 Spring Boot 应用程序
- reactjs - 如何使链接与 card-img-overlay React 一起使用
- groovy - Camunda 通过内联脚本在控制台上打印
- reactjs - 如何在 IIS 上使用 ASP .Net Web API 部署 React 应用程序?
- python - Azure python SDK 在虚拟机中运行 powershell 脚本
- c# - 使用 MailSystem.Net 的带有附件符号的 S/Mime