c++ - QResizeEvent 导致 SIGSEGV

标签 c++ qt resize qwidget segmentation-fault

我的目的是使用名为 overlay.h 的类在 Widget (MarbleWidget) 顶部添加矩形框和文本。下面是我的 GUI 代码。我试图删除所有不必要的部分:

主窗口.cpp

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
    setupUi(this);
}

MainWindow::~MainWindow()
{
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    overlay->resize(event->size());   //////////////// CAUSES SIGSEGV!!!!!!!!!!!!!
    event->accept();
}

void MainWindow::setupUi(QMainWindow *MainWindow)
{
    MainWindow->showMaximized();
    QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    sizePolicy.setHorizontalStretch(0);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(MainWindow->sizePolicy().hasHeightForWidth());
    MainWindow->setSizePolicy(sizePolicy);
    MainWindow->setTabShape(QTabWidget::Rounded);

    QWidget *centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    sizePolicy.setHeightForWidth(centralwidget->sizePolicy().hasHeightForWidth());
    centralwidget->setSizePolicy(sizePolicy);
    centralwidget->setLayoutDirection(Qt::LeftToRight);

    QGridLayout *gridLayout_4 = new QGridLayout(centralwidget);
    gridLayout_4->setObjectName(QString::fromUtf8("gridLayout_4"));

    QSplitter *splitter_4 = new QSplitter(centralwidget);
    splitter_4->setObjectName(QString::fromUtf8("splitter_4"));
    splitter_4->setOrientation(Qt::Horizontal);

    QTabWidget *tabWidget_2 = new QTabWidget(splitter_4);
    tabWidget_2->setObjectName(QString::fromUtf8("tabWidget_2"));
    sizePolicy.setHeightForWidth(tabWidget_2->sizePolicy().hasHeightForWidth());
    tabWidget_2->setSizePolicy(sizePolicy);
    tabWidget_2->setMaximumSize(QSize(443, 16777));
    tabWidget_2->setAutoFillBackground(true);
    tabWidget_2->setTabPosition(QTabWidget::West);
    tabWidget_2->setTabShape(QTabWidget::Rounded);
    tabWidget_2->setIconSize(QSize(30, 16));

    QWidget *tab_10 = new QWidget();
    tab_10->setObjectName(QString::fromUtf8("tab_10"));
    QGridLayout *gridLayout = new QGridLayout(tab_10);
    gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
    QVBoxLayout  *verticalLayout_4 = new QVBoxLayout();
    verticalLayout_4->setObjectName(QString::fromUtf8("verticalLayout_4"));
    QHBoxLayout *horizontalLayout_7 = new QHBoxLayout();
    horizontalLayout_7->setObjectName(QString::fromUtf8("horizontalLayout_7"));
    QLabel *label_3 = new QLabel(tab_10);
    label_3->setObjectName(QString::fromUtf8("label_3"));
    horizontalLayout_7->addWidget(label_3);

    verticalLayout_4->addLayout(horizontalLayout_7);
    QTreeView *treeView_4 = new QTreeView(tab_10);
    treeView_4->setObjectName(QString::fromUtf8("treeView_4"));
    QStandardItemModel *standardModel = new QStandardItemModel ;
    QStandardItem *rootNode = standardModel->invisibleRootItem();
    treeView_4->setModel(standardModel);
    verticalLayout_4->addWidget(treeView_4);
    gridLayout->addLayout(verticalLayout_4, 0, 0, 1, 1);

    tabWidget_2->addTab(tab_10, QString());
    treeView_4->raise();

    Marble::MarbleWidget* MarbleWidget = new Marble::MarbleWidget(splitter_4);

    splitter_4->addWidget(MarbleWidget);
    splitter_4->setStretchFactor(0,0);
    splitter_4->setStretchFactor(1,6);
    gridLayout_4->addWidget(splitter_4, 0, 0, 1, 1);

    MainWindow->setCentralWidget(centralwidget);
    MarbleWidget->raise();
    tabWidget_2->raise();

    overlay = new Overlay(MarbleWidget);
    overlay->raise();

    QMetaObject::connectSlotsByName(MainWindow);
} // setupUi

overlay.h

    #include <QWidget>
    #include <QPainter>

    class Overlay : public QWidget
    {
    public:
        Overlay(QWidget *parent);

    protected:
        void paintEvent(QPaintEvent *event);
    };

overlay.cpp

#include "overlay.h"

Overlay::Overlay(QWidget *parent)
: QWidget(parent)
{
    setPalette(Qt::transparent);
    setAttribute(Qt::WA_TransparentForMouseEvents);
}

void Overlay::paintEvent(QPaintEvent *event)
{
    QFont font;
    font.setStyleHint(QFont::Helvetica, QFont::PreferAntialias);
    font.setPointSize(10);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(QColor(10, 10, 10, 255));
    painter.fillRect(QRect(50, 50, 100, 100), QColor(100, 100, 100, 120));
    painter.setFont(font);
    painter.drawText(20, 20,  "hi..............................");
}

问题是 overlay->resize(event->size()); 在内核运行该行时导致 SIGSEGV

代码有什么问题,我该如何解决?

最佳答案

问题由 freenode 的 Thiago 解决。

他指出 MainWindow->showMaximized(); 导致 resize() 事件在 overlay 初始化之前发生。删除该行或将其移至初始化后即可解决问题。

关于c++ - QResizeEvent 导致 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25119297/

相关文章:

c++ - 数组特征导致模板参数推导失败

c++ - 如何获取平面描述的多边形的顶点

c++ - Qt 所见即所得 - 字体大小问题

java - 调整大小后 JPanel 背景图像未填充面板

iPhone获取图像宽度和大小

c++ - new 分配的 free() 内存安全吗?

c++ - 可以使用模板按名称访问结构变量吗?

c++ - 设置QTcpSocket的sockopt

qt - qt pro 文件中存在空间问题

c++ - 当你想减小 vector 的大小时,为什么 std::vector::resize() 不释放内存?