`
tcspecial
  • 浏览: 911552 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

QObject::connect: Cannot queue arguments of type 'QMap<QString,QString>'

    博客分类:
  • QT
阅读更多

   QObject::connect: Cannot queue arguments of type 'QMap<QString,QString>',(Make sure 'QMap<QString,QString>' is registered using qRegisterMetaType().).  

   上述错误,只有在跨线程信号传递时才会出现.  因为QMap是QT可识别的基本类型,不需要再注册元对象系统中,在同一个线程中运行没有问题.

   源码: 

// 线程类 thread.h 
class Thread:public QThread
{
    Q_OBJECT

public:
    Thread(){}
    ~Thread(){}

protected:
    virtual void run();

signals:
    void sendMsg(const QMap<QString,QString> &msgs);
}

  

// 信号接收类 test.h
Test(Thread *th):m_th(th)
{
  // 不同线程用队列方式连接
  connect(m_th,SIGNAL(sendMsg(const QMap<QString,QString> &)),this,SLOT(handle(const QMap<QString,QString> &)),Qt::QueuedConnection);
}

 

    解决方案:通过qRegisterMetaType()方法注册至Metype中

// thread.h
typedef QMap<QString,QString> StringMap; // typedef操作符为QMap起一别名

void sendMsg(const StringMap &);

 

// test.h 
Test(Thread *th):m_th(th)
{
	// 注册QMap至元对象系统
	qRegisterMetaType<StringMap>("StringMap");
	connect(m_th,SIGNAL(sendMsg(const StringMap &)),this,SLOT(handle(const StringMap &)),Qt::QueuedConnection);
}

 

     

 

分享到:
评论

相关推荐

    QObject::moveToThread用例

    QObject调用moveToThread(QThread *targetThread)后, 运行targetThread.start(),此后QObject的事件将在targetThread中处理。 比如:QObject的槽函数,将在targetThread中处理。

    QSerialport多线程方法

    QObject: Cannot create children for a parent that is in a different thread. QObject::startTimer: Timers cannot be started from another thread 原因:在主线程中创建了QSerialPort对象在子线程中调用,或者...

    Qt connect传参方式及lambda函数传参方式演示

    QObject::connect(sender, &Sender::signal, nullptr, static_cast&lt;void(*)(int)&gt;(processValue)); ``` `processValue`是一个接受整数参数的全局函数。 ### 6. 连接多个槽 `connect`可以将一个信号连接到多个槽,...

    qt编写的mqtt客户端程序,带源码

    qDebug() &lt;&lt; "Received message on topic" &lt;&lt; msg.topic &lt;&lt; ":" &lt;&lt; msg.payload; }); ``` 7. **保持连接**:为了保持连接,可以设置定时器定期发送心跳包。MQTT协议允许客户端通过"PINGREQ"报文向服务器发送心跳...

    Qt容器类(QList,QMap)遍历器的使用

    QMap&lt;QString, int&gt; myMap = {"apple", 1}, {"banana", 2}, {"cherry", 3}; for (QMap&lt;QString, int&gt;::iterator it = myMap.begin(); it != myMap.end(); ++it) { qDebug() &lt;&lt; it.key() &lt;&lt; ":" &lt;&lt; it.value(); } ``...

    Qt信号和槽

    QObject::connect(&worker, SIGNAL(started()), []{ qDebug() &lt;&lt; "Worker thread has started"; }); worker.start(); return 0; } ``` **1. 信号** - `void started();` 定义了一个信号`started()`,在`run`...

    TestSonya,Qt判断文本编码格式(支持UTF-8、UTF-16LE/BE、GBK等格式)

    #include &lt;QString&gt; #include &lt;QTextCodec&gt; enum EncodingFormat { ANSI, UTF16LE, UTF16BE, UTF8, UTF8BOM, }; class Skysonya : public QObject { Q_OBJECT Q_ENUM(EncodingFormat) public: explicit ...

    编译Qt5.11.1的mysql驱动并处理driver not loaded错误

    QT5.11.1+MSVC2015_64位下重新编译好的64位Qt 5.11.1的mysql驱动,mysql采用的版本是5.7.22。把qsqlmysql.dl放到QT5的plugins\... qDebug() &lt;&lt; "Failed to connect to root mysql admin: " &lt;&lt; error.databaseText(); }

    Qt学习之路 绝对经典

    QObject::connect(watcher, &QFutureWatcher&lt;int&gt;::finished, [&](){ resultLabel-&gt;setText("Finished after " + QString::number(watcher-&gt;result()) + " seconds."); }); watcher-&gt;setFuture(future); }); ...

    QTcpSocket使用.doc

    - 错误描述:在QThread中将QTcpSocket的信号与槽函数连接时,出现“QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError'”的错误。 - 解决方案:有两种方法,一是将连接方式改为`Qt...

    testdll.zip

    在IT行业中,动态库(DLL,Dynamic Link Library)是一种重要的软件开发技术,广泛应用于Windows操作系统。本示例中,我们有一个名为"testdll.zip"的压缩包,它包含了一个简单的DEMO,目的是为了演示如何处理动态库...

    echartgauge_QT_echarts_echart_

    QObject::connect(channel, &QWebChannel::objectRegistered, this, [this, webView](QString objectName) { if (objectName == "myChart") { QWebChannel *webChannel = webView-&gt;page()-&gt;webChannel(); ...

    QT事件处理系统之四:自定义事件的注册及拦截

    3. **创建并发送事件**:在需要发送自定义事件的地方,创建一个`SelfEvent`对象,并通过`QCoreApplication::postEvent()`或`QObject::sendEvent()`发送给目标对象。 ```cpp SelfEvent *event = new SelfEvent(); ...

    自己做的简单取色器 好用简单

    鼠标取色器,取值取色值源码,鼠标全屏幕取点取色。switch (e-&gt;type()) { case QEvent::MouseMove: MouseMoveColorPicker((QMouseEvent *)e); break; ... return QObject::eventFilter(obj, e);

    QT网页制作

    QObject::connect(ui-&gt;actionForward, &QAction::triggered, webView, &QWebEngineView::forward); QObject::connect(ui-&gt;actionReload, &QAction::triggered, webView, &QWebEngineView::reload); QObject::connect...

    QT嵌入网页

    QObject::connect(view, &QWebEngineView::javascriptConsoleMessage, [](const QString &message, int lineNumber, const QString &sourceId) { qDebug() &lt;&lt; "JavaScript console message:" &lt;&lt; message &lt;&lt; "at ...

    qt关机程序

    QObject::connect(timer, &QTimer::timeout, &shutdownSystem); timer-&gt;setInterval(60000); // 设置为1分钟后关机 timer-&gt;start(); return app.exec(); } ``` 这段代码创建了一个将在1分钟后触发的定时器,并...

    QT EventFilter事件过滤器样例(无bug)

    在QT中,EventFilter是一个类,它可以重写`QObject::eventFilter()`方法来拦截并处理对象接收到的事件。当一个对象被设置为另一个对象的事件过滤器时,它会先于被过滤对象接收事件,如果事件过滤器处理了这个事件,...

    信号与槽的两种深度玩法源码

    QObject::connect(&button, &QPushButton::clicked, SLOT(printMessage(QString))); button.show(); return app.exec(); } ``` 在上述例子中,`std::bind`和`SLOT`宏分别将`printMessage`函数转换为可连接的槽...

    Qt事件过滤器Demo

    Qt事件过滤器(Event Filter)允许你在Qt应用程序中捕捉和处理事件,而无需修改原始的事件处理...3. **处理特定类型的事件:** 在事件过滤器函数中,你可以通过 `event-&gt;type()` 检查事件的类型,并根据需要处理事件。

Global site tag (gtag.js) - Google Analytics