0

主窗口.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

我的对象.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

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

主窗口.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);
}

我的对象.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();. 我想将 disableStartButton() 连接到 mainwindow.cpp 中的 disableStartButton()。

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

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

4

1 回答 1

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);

于 2013-04-10T21:10:26.813 回答