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

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

メインウィンドウ.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";
}

私は2つのことをしようとしています。

(1): pushButton をクリックしたらすぐに cThread を起動させたい。

(2): cThread が開始されるとすぐに、次のことを行いますemit disableStartButton();。mainwindow.cpp で disableStartButton() を 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 に答える