【问题标题】:Program crashes because of wrong usage of slots and signals由于插槽和信号的错误使用导致程序崩溃
【发布时间】:2015-04-14 15:55:23
【问题描述】:

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

程序可以编译,但在启动后立即崩溃。我认为我在插槽和信号方面做错了,但找不到我的错误。

【问题讨论】:

  • 为什么要在 connect() 调用中转换为 QObject?你不需要。
  • class MockClamWrapper : !!!public!!! QObject

标签: c++ qt qt-signals


【解决方案1】:

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

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

【讨论】:

  • 那太愚蠢了。非常感谢。
  • 为了防止将来出现此类错误 - 使用智能指针。因为捕获和调试空引用异常要容易得多。
猜你喜欢
  • 2014-08-27
  • 2020-03-23
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多