2013-04-10 64 views
0

mainwindow.h:需要帮助从螺纹连接信号GUI到插槽

#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),I得到这个错误:

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

回答

1

当然,还有UI是未定义的。您尝试在文件myobject.cpp,连接ui->pushButton

connect(ui->pushButton, SIGNAL(clicked()), &cThread, SLOT(start())); // (1) 

当你的用户界面只在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); 
} 

right after ui->setupUi(this);