在GUI中需要帮助将信号从线程连接到插槽

时间:2013-04-10 20:52:25

标签: qt signals-slots

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void disableStartButton();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QtCore>

class MyObject : public QObject
{
    Q_OBJECT
public:
    explicit MyObject(QObject *parent = 0);
    void doSetup(QThread &cThread);

signals:
    void disableStartButton();

public slots:
    void doWork();    

};

#endif // MYOBJECT_H

main.cpp中:

#include "mainwindow.h"
#include "myobject.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QThread cThread;
    MyObject cObject;
    cObject.doSetup(cThread);
    cObject.moveToThread(&cThread);

    return a.exec();
}

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void MainWindow::disableStartButton() {
    ui->pushButton->setEnabled(false);
}

myobject.h:

#include "myobject.h"
#include <QDebug>

MyObject::MyObject(QObject *parent) :
    QObject(parent)
{
}

void MyObject::doSetup(QThread &cThread)
{
    connect(&cThread, SIGNAL(started()), this, SLOT(doWork()));
    connect(ui->pushButton, SIGNAL(clicked()), &cThread, SLOT(start())); // (1)
    connect(this, SIGNAL(disableStartButton()), ui, SLOT(disableStartButton())); // (2)
}

void MyObject::doWork()
{
    emit disableStartButton();
    qDebug() << "1";
}

我正在尝试做两件事。

(1):单击pushButton后,我希望cThread启动。

(2):一旦cThread启动,它就会:emit disableStartButton();。我想在mainwindow.cpp中将disableStartButton()连接到disableStartButton()。

对于(1),我收到此错误:

myobject.cpp:12:错误:C2065:'ui':未声明的标识符

1 个答案:

答案 0 :(得分:1)

当然,ui未定义。您尝试连接ui->pushButton

    connect(ui->pushButton, SIGNAL(clicked()), &cThread, SLOT(start())); // (1)
文件myobject.cpp中的

,当你的ui只在mainwindow.cpp中声明时 你必须将按钮连接到mainwindow.cpp文件中的线程,希望有帮助

顺便说一句,您应该创建不在main.cpp中的对象,但在您的情况下,在mainwindow.cpp中,移动行

QThread cThread;
MyObject cObject;
cObject.doSetup(cThread);
cObject.moveToThread(&cThread);

在构造函数中提交mainwindow.cpp,例如

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

ui->setupUi(this);

之后