1

ユーザーが QPushButton を押すと、メイン ウィンドウの QListWidget にテキストを追加するセカンダリ スレッドがトリガーされるアプリケーションを作成したいと考えています。しかし、私が理解できない理由により、スレッドからメインウィンドウへのシグナルは送信されますが、宛先には到達しません。おそらく接続に失敗したためです。しかし、ここでこれが起こる理由は私のコードです(私のアプリケーションはVisual Studio 2010を使用してコンパイルされています):

mythread.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

mythread.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);
}

find.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();
}

検索プロ:

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

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

2 に答える 2

2

2つのこと:

  1. 2 番目の接続呼び出しでは、次のQstringように変更する必要があります。QString
  2. デフォルトでは、Qt はQString&複数のスレッドにまたがって配信できません。これを修正するには、次の 2 つの方法があります。
    1. シグナルとスロット、および接続を変更してQStringQString&
    2. 使用可能にするために、qRegisterMetaTypeQString&を使用します。

私はまだ読むことをお勧めします

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

とKariさんのコメント

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 に答える