首页 > 解决方案 > QT 5.15:创建 QPushButton 会使程序崩溃

问题描述

使用最新的 QT 5.15.0、c++20、cmake 3.17、MSVC 16.7.2

我有一个简单的 QWidget:(所有必要的包含在预编译头文件中定义)

小部件.h

#pragma once
#ifndef _WIDGET_H_209323
#define _WIDGET_H_209323

class TestWidget: public QWidget {
    Q_OBJECT

public:
    explicit TestWidget(QWidget* parent = nullptr);

private:
    QVBoxLayout* side_panel_;

private:
    auto init_elements() -> void;
};

#endif

小部件.cpp:

#include "widget.h"

TestWidget::TestWidget(QWidget* parent) : QWidget(parent) {
    init_elements();
}

auto TestWidget::init_elements() -> void {
    auto init_main_panel = [this]() {
        side_panel_ = new QVBoxLayout();
        QPushButton* main_view = new QPushButton("test");

        side_panel_->addWidget(main_view);
    };

    init_main_panel();

    this->setLayout(side_panel_);
}

该程序编译良好,但在启动时崩溃,Process finished with exit code -1073741511 (0xC0000139)没有别的。

例如,更改QPushButton为任何其他小部件

QLabel* label = new QLabel(this);
label->setText("test");
side_panel_->addWidget(label);

按预期工作,没有任何问题。

实际上,只需将widget.hwith添加QPushButton到 CMakeLists.txtadd_target中,而不将其包含在任何其他项目文件中,程序就会在启动时崩溃。

更新:尝试将项目加载到 Visual Studio 并得到更有意义的错误:

The procedure entry point
?hitButton@QPushButton@@MEBA_NAEBVQPoint@@@Z
could not be located int the dynamic link library

更新 2:将 QT 版本更改为 5.14.2 可修复此问题。这两个版本都是从官方 QT 安装程序安装为 MSVC 预编译的 64 位(5.14 的 MSVC2017 和 5.15 的 MSVC2019)。

标签: c++windowsqtvisual-c++cmake

解决方案


推荐阅读