其他分享
首页 > 其他分享> > c – Qt:信号/插槽设计和性能

c – Qt:信号/插槽设计和性能

作者:互联网

我最近开始使用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()信号做出反应,我可以看到使用信号和插槽的好处.

那么什么是更好的选择,两者之间的表现有什么不同?

解决方法:

第一个选项确实提供了比使用信号/插槽机制更好的性能,但它的缺点是MainWindow和DataManager之间存在紧密耦合.两者都互相认识,所以不能真正单独使用.
仅此一点应该已经成为重构代码的理由.

也就是说,作为第三种选择,你可以让MainWindow拥有从DataWorker接收信号的插槽,让DataManager成为一个帮助类,只需将数据转换为MainWindow的可用格式.

class MainWindow
{
private:
    DataManager* dm;

public:
    MainWindow() : dm(new DataManager()) { }
    displayData(QString processedData);
private slots;
    eventNewData()
    {
        // get the data
        QString processedData = dm->preprocessData(data);
        displayData(processedData);
        // release data
    }
};

class DataManager
{
public:
    QString preprocessData(...);
};

标签:c,oop,qt,signals,class-design
来源: https://codeday.me/bug/20190826/1725541.html