枚举信号参数
Enum signal parameter
我正在尝试使用自定义枚举类型使用QT的信号和插槽机制。
我已经阅读了所有以下内容,但没有任何帮助:
- http://doc.qt.digia.com/4.7-snapshot/qtbinding.html#using-enumerations-enumerations-us-a-custom-type
- QT-无这样的信号错误
- 用枚举作为参数的QT信号
detectorenginethread.h:
class DetectorEngineThread : public QThread
{
Q_OBJECT
Q_ENUMS(ErrorCode)
Q_ENUMS(Status)
public:
enum ErrorCode
{
...
};
enum Status
{
...
};
...
signals:
void statusChanged(Status newStatus);
void processingError(ErrorCode code);
};
Q_DECLARE_METATYPE(DetectorEngineThread::ErrorCode)
Q_DECLARE_METATYPE(DetectorEngineThread::Status)
mainwindow.h:
...
#include "DetectorEngineThread.h"
...
class MainWindow : public QMainWindow
{
Q_OBJECT
...
private:
DetectorEngineThread* m_detEng;
...
private slots:
void on_detEng_statusChanged(DetectorEngineThread::Status newStatus);
void on_detEng_processingError(DetectorEngineThread::ErrorCode errorCode);
...
};
mainwindow.cpp:
...
#include "MainWindow.h"
...
MainWindow::MainWindow(...) : ...
{
...
qRegisterMetaType<DetectorEngineThread::Status>("DetectorEngineThread::Status");
qRegisterMetaType<DetectorEngineThread::ErrorCode>("DetectorEngineThread::ErrorCode");
...
m_detEng = new DetectorEngineThread(...);
connect(m_detEng, SIGNAL(statusChanged(DetectorEngineThread::Status)),
this, SLOT(on_detEng_statusChanged(DetectorEngineThread::Status)), Qt::QueuedConnection);
connect(m_detEng, SIGNAL(processingError(DetectorEngineThread::ErrorCode)),
this, SLOT(on_detEng_processingError(DetectorEngineThread::ErrorCode)), Qt::QueuedConnection);
...
}
...
void MainWindow::on_detEng_statusChanged(DetectorEngineThread::Status newStatus)
{
...
}
void MainWindow::on_detEng_processingError(DetectorEngineThread::ErrorCode errorCode)
{
...
}
...
在运行时,我会收到以下消息(在QT创建者的应用程序输出面板中):
对象::连接:没有这样的信号
detectorenginethread :: statuschanged(detectorenginethread ::状态)...
对象::连接:没有这样的信号
detectorenginethread :: processingingerror(detectorenginethread :: errorcode)in ...
,显然,尽管发出了匹配的信号,但插槽的代码从未运行。
我尝试了:
- 将枚举转移到全球范围中,但问题仍然存在。
- 通过qmetaobject :: ConnectSlotsByname自动连接信号和插槽,但是遇到了相同的问题。
- 在qregistermetatype和q_declare_metatype中使用本地名称(例如状态而不是detctorEnginethRead ::状态),并且还尝试在信号和插槽宏中使用它们。
在信号和插槽中声明的枚举应完全限定:
:void statusChanged(Status newStatus);
void processingError(ErrorCode code);
应该是:
void statusChanged(DetectorEngineThread::Status newStatus);
void processingError(DetectorEngineThread::ErrorCode code);
相关文章:
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Qt5 - 如何将"QList<T> *"指针作为信号参数传递,并在完成后将其删除?
- Qt moveToThread,带有参数的信号/插槽
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- Qt C++:静态断言失败:信号和插槽参数不兼容
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 使用 enum 参数将 C++ 对象信号连接到 QML 信号处理程序
- 当通过引用传递 QObject 时,C++信号的参数在 QML 中显示为"未定义"
- 这是在Qt信号和插槽中使用参数调用函数的好方法吗?
- q_property通知信号及其参数
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- Qt:在 selectionchanged() 信号中传递一个参数
- Qt - 使用λ函数修改先前连接信号的插槽参数
- 对于属性上的 NOTIFY 信号,如果我给它一个参数有什么区别?
- Qt信号和插槽:是复制的参考参数
- 如何将信号作为函数参数传递
- boost::信号与来自静态成员函数的参数
- 提升 1.55,而 13 信号参数错误数
- C++当被ctrl-c中断时,在死亡之前调用带有参数(信号号除外)的函数