2015-04-14 3 views
0

Что я пытаюсь сделать, так это вызвать много времени (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); 
} 

Программа компилируется, но он выходит из строя сразу после запуска. Я предполагаю, что я делаю что-то неправильно с слотами и сигналами, но не могу найти свою ошибку.

+0

Почему вы выполняете вызов QObject в вызове connect()? Вам не нужно. –

+0

@HamishMoffatt Я получаю «C2243:« тип cast »: преобразование из 'MockClamWrapper *' в 'const QObject *' существует, но недоступно", если я этого не делаю. – AndreySarafanov

+0

'класс MockClamWrapper: !!! public !!! QObject' –

ответ

1

Причина аварии заключается в том, что вы не делаете никаких экземпляров класса MockClamWrapper. В инструкции connect вы ссылаетесь на указатель, который указывает на ничего. Сделайте новый объект, а затем подключитесь:

clam = new MockClamWrapper(); 
connect(clam, SIGNAL(databaseLoaded()), this, SLOT(enableWindow())); 
+0

Это было глупо .. Большое спасибо. – AndreySarafanov

+0

Чтобы предотвратить такие ошибки в будущем, используйте интеллектуальные указатели. Потому что гораздо легче поймать и отладить исключение нулевой ссылки. –

+0

Кстати, вы должны проверить свой код подключения() ... –

 Смежные вопросы

  • Нет связанных вопросов^_^