QT将不同类的信号和插槽连接到主窗口类?
Posted
技术标签:
【中文标题】QT将不同类的信号和插槽连接到主窗口类?【英文标题】:QT connect signal and slot in from different classes to mainwindow class? 【发布时间】:2018-08-30 08:02:23 【问题描述】:我想在mainwindow
和reader
两个类之间实现信号和槽。
在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将不同类的信号和插槽连接到主窗口类?的主要内容,如果未能解决你的问题,请参考以下文章