1

我想制作一个应用程序,用户将在其中点击 QPushButton,这将触发辅助线程,该线程将向主窗口中的 QListWidget 添加一些文本。但是由于我无法弄清楚的原因,尽管从线程到主窗口的信号被发出,但它永远不会到达目的地。可能是因为连接失败。但是为什么会发生这种情况是我的代码(我的应用程序是使用 Visual Studio 2010 编译的):

我的线程.h

#ifndef MY_THREAD_H
#define MY_THREAD_H
#include <QThread>
#include <QString>
class mythread:public QThread
{
    Q_OBJECT

public:
    void setName(QString& name);
signals:
    void sendMsg(QString& msg);
protected:
    void run();
private:
    QString m_name;
    QString msg;
};
#endif

我的线程.cpp

#include "mythread.h"
void mythread::setName(QString& name)
{
    m_name=name;
}
void mythread::run()
{
    msg="Hello "+m_name;
    emit sendMsg(msg);
}

mydialog.h:

#ifndef MY_DIALOG_H
#define MY_DIALOG_H
#include <QtGui>
#include "mythread.h"
class mydialog:public QDialog
{
    Q_OBJECT
public:
    mydialog();
public slots:
    void receiveMsg(QString& msg);
    void fillList();
private:
    QListWidget list1;
    QPushButton btn1;
    QGridLayout layout;
    mythread thread;
};
#endif

mydialog.cpp:

#include "mydialog.h"
mydialog::mydialog()
{
    layout.addWidget(&list1,0,0);
    btn1.setText("Find");
    layout.addWidget(&btn1,0,1);
    setLayout(&layout);
    QString myname="leonardo";
    thread.setName(myname);
    connect(&btn1,SIGNAL(clicked()),this,SLOT(fillList()));
    connect(&thread,SIGNAL(sendMsg(QString&)),this,SLOT(receiveMsg(Qstring&)));
}
void mydialog::fillList()
{
    thread.start();
}
void mydialog::receiveMsg(QString& msg)
{
    list1.addItem(msg);
}

查找.cpp:

#include <QApplication>
#include "mydialog.h"
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    mydialog window;
    window.setWindowTitle("Find");
    window.show();
    return app.exec();
}

查找.pro:

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += mydialog.h mythread.h
SOURCES += find.cpp mydialog.cpp mythread.cpp
4

2 回答 2

2

两件事情:

  1. 在您的第二次连接呼叫中,Qstring必须更改为QString
  2. 默认情况下, Qt 不能QString&跨线程传递。有两种方法可以解决这个问题:
    1. 更改您的信号和插槽以及连接以使用QString而不是QString&
    2. 使用qRegisterMetaType以使其QString&可用。

我仍然建议阅读

https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong

和卡里的评论

https://www.qt.io/blog/2010/06/17/youre-doing-it-wrong#commento-comment-name-a6fad43dec11ebe375cde77a9ee3c4331eb0c5f0bcac478ecbe032673e8ebc82

但是,在使用线程时。

于 2012-11-29T09:30:01.027 回答
1

const如果您不打算修改它,首先使用限定符作为参数。在修复连接中的错字SLOT(receiveMsg(Qstring&))并将信号和插槽签名更改为 const 引用后一切正常

于 2012-11-29T14:11:28.013 回答