我最近开始使用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()信号,使用信号和槽的好处就能显现出来。
那么哪个选项更好,并且这两者之间是否有性能差异?