Qt Gui和线程

时间:2014-05-08 13:34:38

标签: multithreading qt qt5

我会创建一个可视化事件管理器,将所有内容写入MainWindow中的listWidget,但不起作用。而且,如果ClassA启动一个线程,如何在listWidget中写一条消息?我有这个课程:

MainWindow.cpp

#include "mainwindow.h"
#include "ui_MainWindow.h"
#include "classA.h"

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow) {
    ui->setupUi(this);
    myClass= new classA();
}

QObject::connect(myClass, SIGNAL(makeSomething(QString)), this, SLOT(showMessageInConsole(QString)));

MainWindow::~MainWindow() {
    delete ui; 
}

void MainWindow::showMessageInConsole(QString msg) {
    ui->listWidget->addItem(msg);
}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "classA.h"

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void showMessageInConsole(QString msg);

private:
    Ui::MainWindow *ui;
    classA * myClass;
};

#endif

ClassA.cpp

ClassA::ClassA()
{
    // make something
    emit makeSomething("msg");
}

ServerThreaded::~ServerThreaded()
{
}

ClassA.h

#ifndef CLASSA_H
#define CLASSA_H

class ClassA: public QObject
{
    Q_OBJECT

public:
    ClassA(QWidget *parent);
    ~ClassA();


public slots:

signals:
    void makeSomething(QString msg);

private:

};

#endif

1 个答案:

答案 0 :(得分:1)

在将ClassA::makeSomething信号连接到任何地方之前,您会发出// classa.h public slots: void emitMySignal(); 信号。将信号发射移动到其他位置,例如插槽。

// classa.cpp

void ClassA::emitMySignal()
{
    emit makeSomething("msg");
}

// mainwindow.h

signals:
    void requestMessage();

// mainwindow.cpp

QObject::connect(this, SIGNAL(requestMessage()), myCLass, SLOT(emitMySignal()));
...
emit requestMessage();

ClassA

如果ClassA启动一个线程,如何在listWidget中写一条消息?

使用信号和插槽。将来自工作人员对象的信号连接到ClassA班级的信号,并将该信号从MainWindow对象连接到{{1}}的插槽。