我最近开始使用 Qt,我需要对信号/插槽机制进行一些说明。我了解它是一个很好的工具,用于 GUI 和生活在不同线程中的对象之间的通信,但我不太确定是否应该在像下面这样的简单情况下使用它。
我有三个类,我们称它们为 MainWindow、DataManager 和 DataWorker。DataWorker 位于一个单独的线程中,并在新数据准备好收集时发出信号。然后在经过一些处理后在 MainWindow 小部件中可视化。我创建了 DataManager 类,以免用处理代码污染 GUI 类。
现在,我应该如何处理 DataManager 和 MainWindow 之间的通信。
选项#1 - 有一个指向 MainWindow 作为成员的指针,只需调用它的方法
class MainWindow
{
private:
DataManager* dm;
public:
MainWindow() : dm(new DataManager(this)) { }
displayData(const char* processedData);
}
class DataManager : QObject
{
private:
MainWindow *mw;
private slots;
eventNewData()
{
// get and process the data
mw = this->QObject.parent();
mw->displayData(const char* processedData);
// release data
}
}
选项 #2 - 发出新数据以调用 MainWindow 插槽
class MainWindow
{
private:
DataManager* dm;
private slots:
displayData(const char* processedData);
public:
MainWindow() : dm(new DataManager(this)) { QObject::connect(dm, SIGNAL(newData(const char*)), this, SLOT(displayData(const char*)); }
};
class DataManager : QObject
{
signals:
newData(const char* processedData);
private slots;
eventNewData()
{
// get and process the data
emit newData(processedData);
// release data
}
}
选项 1 对我来说似乎更直观,但话又说回来,我不太了解 Qt。如果有更多类我想对 newData() 信号做出反应,我可以看到使用信号和插槽的好处。
那么有什么更好的选择,两者之间的性能有什么区别吗?