Что я пытаюсь сделать, так это вызвать много времени (MockClamWrapper::loadDatabase()
) в отдельном потоке в момент создания моего окна, а затем обновить мое окно после операция завершена. Вот код, который у меня есть.Сбой программы из-за неправильного использования слотов и сигналов
MockClamWrapper.h
class MockClamWrapper : QObject
{
Q_OBJECT
public:
MockClamWrapper();
~MockClamWrapper();
bool loadDatabase(unsigned int *signatureCount=NULL);
Q_SIGNALS:
void databaseLoaded();
};
MockClamWrapper.cpp
bool MockClamWrapper::loadDatabase(unsigned int *signatureCount){
QThread::currentThread()->sleep(10);
databaseLoaded();
return true;
}
mainwindow.h
#include <QMainWindow>
#include <QFileDialog>
#include "mockclamwrapper.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public slots:
void enableWindow();
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
MockClamWrapper *clam;
void initWindow();
};
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect((QObject*)clam, SIGNAL(databaseLoaded()),(QObject*)this,SLOT(enableWindow()));
QFuture<void> fut = QtConcurrent::run(this,&MainWindow::initWindow);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initWindow(){
clam->loadDatabase(NULL);
}
void MainWindow::enableWindow(){
ui->checkFileButton->setEnabled(true);
}
Программа компилируется, но он выходит из строя сразу после запуска. Я предполагаю, что я делаю что-то неправильно с слотами и сигналами, но не могу найти свою ошибку.
Почему вы выполняете вызов QObject в вызове connect()? Вам не нужно. –
@HamishMoffatt Я получаю «C2243:« тип cast »: преобразование из 'MockClamWrapper *' в 'const QObject *' существует, но недоступно", если я этого не делаю. – AndreySarafanov
'класс MockClamWrapper: !!! public !!! QObject' –