c++ - 由于槽和信号的错误使用导致程序崩溃

标签 c++ qt qt-signals

我想做的是在创建窗口时在单独的线程中调用一个耗时的操作(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;
}

主窗口.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();
};

主窗口.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);
}

程序可以编译,但在启动后立即崩溃。我假设我对插槽和信号做错了什么,但找不到我的错误。

最佳答案

崩溃的原因是您没有创建类 MockClamWrapper 的任何实例。在 connect 语句中,您引用了一个指向任何内容的指针。创建一个新对象然后连接:

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

关于c++ - 由于槽和信号的错误使用导致程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29618427/

相关文章:

c++ - 简单的 C++ 声音 API

c++ - 如何在 Qt 中创建动态信号和槽?

C++ 从 C 类调用 A 类中的构造函数(继承)

c++ - 如何在 C++ 中确定一个巨大的二进制文件的大小

C++11:如果不为 std::thread 调用 join() 会发生什么

c++ - 监听来自 C++ Q_OBJECT 的附加 Component.onCompleted 和 Component.onDestroyed 信号

c++ - 为什么执行 socket::readyRead() 的新信号,即使其较早的插槽仍在处理中?

c++ - 如何在 C++ 中实现交换器(会合模式)?

qt - 调用父 .pro 文件中定义的自定义 QMake 函数

c++ - 正则表达式通过正则表达式测试器但在 qt 中失败