ソース: https://mega.co.nz/#!xUMiSRYC!Y8Sxz2fEFb6yEIrnKiGx9n2zeK4YTUwUrCByaAkcOPI
QThread::currentThread()->quit(); で問題が発生しています。
myobject.cpp を開いて 13 行目に進むと、quit() 呼び出しが終了するはずです。しかし、quit() 呼び出しが機能していないようで、スキップするだけです。問題が見えません。:(
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
QObject::connect(&a, SIGNAL(aboutToQuit()),
&w, SLOT(cleanUp()));
return a.exec();
}
メインウィンドウ.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myobject.h"
#include <QMessageBox>
MyObject* cObject;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setFixedSize(this->size());
cThread = new QThread(this);
cObject = new MyObject();
cObject->moveToThread(cThread);
QObject::connect(ui->pushButton_2, SIGNAL(clicked()),
this, SLOT(close()));
QObject::connect(cThread, SIGNAL(started()),
cObject, SLOT(doWork()));
QObject::connect(ui->pushButton, SIGNAL(clicked()),
this, SLOT(runThreadSlot()));
QObject::connect(cThread, SIGNAL(finished()),
cThread, SLOT(deleteLater()));
QObject::connect(cThread, SIGNAL(finished()),
cObject, SLOT(deleteLater()));
QObject::connect(cObject, SIGNAL(setStatusBarSignal(QString)),
this, SLOT(setStatusBarSlot(QString)));
ui->lineEdit->setValidator(new QIntValidator(this));
ui->lineEdit->setFocus(Qt::OtherFocusReason);
ui->statusBar->showMessage("Waiting for input...");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::runThreadSlot()
{
cThread->start();
// I've trimmed some code here.
}
void MainWindow::setStatusBarSlot(QString text)
{
ui->statusBar->showMessage(text);
}
void MainWindow::cleanUp()
{
qDebug() << "Cleaning up!";
cObject->stage = 0;
cThread->wait();
}
myobject.cpp:
#include "myobject.h"
#include <QPixmap>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
MyObject::MyObject(QObject *parent) :
QObject(parent)
{
}
void MyObject::doWork()
{
QThread::currentThread()->quit(); // It doesn't stop here. This is my issue.
// I've trimmed the code here.
}
メインウィンドウ.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 runThreadSlot();
void setStatusBarSlot(QString);
void cleanUp();
private:
Ui::MainWindow *ui;
QThread* cThread;
};
#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);
QFile path;
qint32 waitSecs;
int stage;
signals:
void setStatusBarSignal(QString);
public slots:
void doWork();
};
#endif // MYOBJECT_H