QT将不同类的信号和插槽连接到主窗口类?

Posted

技术标签:

【中文标题】QT将不同类的信号和插槽连接到主窗口类?【英文标题】:QT connect signal and slot in from different classes to mainwindow class? 【发布时间】:2018-08-30 08:02:23 【问题描述】:

我想在mainwindowreader 两个类之间实现信号和槽。

reader 类中,我声明了信号SetProgress

reader.h

class reader :public QObject
    
        Q_OBJECT    
         signals:
             void SetProgress(QString sOperation, int nPercentage);

reader.cpp

 void reader::UpdateProgress(double amount)

     int nPrecentage = (100 * amount / (max- min));
     emit SetProgress(m_sCurrentOperation, nPrecentage); 

主窗口.h

    public:
    reader *MyReader

private slots:

    void SlotDisplayProgress(QString sActivity_i, int ProgressPercentage_i);

主窗口.cpp

void mainwindow :: SlotDisplayProgress(QString sActivity_i, int nProgressPercentage_i)

     this->ui->QprogressBar->setValue(nProgressPercentage_i);

在 Mainwidow.cpp 我将声明信号和槽

MyReader = reader::New();
connect ( MyReader, &reader::SetProgress, this, &mainwindow::SlotDisplayProgress );

我尝试调试,直到emit 部分都正常工作。但是,slot 永远不会执行。

【问题讨论】:

什么异常? 在 mainwindow.exe 中的 0x00007FFE1A48063A (Qt5Cored.dll) 处引发异常:0xC0000005:访问冲突读取位置 0xFFFFFFFFFFFFFFFF。 好像MyReader 是一个无效的指针。 我将在 mainwindow.cpp (reader *MyReader) 中创建对象 您仍然必须为您的指针分配一个有效值。 reader *Myreader; 没有为您的指针分配任何有效值。 【参考方案1】:

尝试设置 Qt::DirectConnection:

connect ( MyReader, &reader::SetProgress, this, &mainwindow::SlotDisplayProgress, ***Qt::DirectConnection***);

我遇到了这样的问题,我连接了信号和插槽,它只有在我定义了连接类型时才有效。

我希望这会有所帮助。


PS。我不知道这是否取决于 QT 的版本,但是当我连接信号和插槽时,我编写的语法如下:

ImageURLLoadListener* downloader = new ImageURLLoadListener(&id, socket);
connect(downloader, SIGNAL(imageLoaded(QString*,QTcpSocket*)), this, SLOT(on_resourceImageDownload(QString*,QTcpSocket*)), Qt::DirectConnection);

不知道有没有关系……

【讨论】:

我会试试这个。但是,这个仍然不适合我【参考方案2】:

是 MyReader 指针吗?如果不是这样,请使用 &MyReader。

【讨论】:

我在应用 &Myreader 后遇到了这个错误。错误 E0304 重载函数“mainwindow::connect”的实例与参数列表不匹配 SetProgress 和 SlotDisplayProgress 需要 2 个参数,尝试使用:connect ( &MyReader, SIGNAL(SetProgress(QString,int)), this, SLOT(SlotDisplayProgress(QString,int)); 显示所有相关代码以便快速修复。 (reader.h 中的阅读器类,跳过非关联函数和成员) @deMax,OP 出现运行时错误。如果 MyReader 不是指针,则代码将无法编译。 如何创建 MyReader 对象?显示更多代码。 ( 读者 *MyReader = new MyReader; ) ?

以上是关于QT将不同类的信号和插槽连接到主窗口类?的主要内容,如果未能解决你的问题,请参考以下文章

Qt将信号连接到插槽

Qt for Qt:如何连接到具有新信号/插槽风格的信号?

如何在 Qt 中将插槽连接到信号 QProcess::started()?

如何将信号连接到插槽

Qt Connect 无法连接到插槽

是否可以将模型对象的插槽连接到 QT4 -Designer 中的 GUI?