三味线
三味线
Published on 2026-04-23 / 1 Visits
0
0

自定义QProxyStyle导致的崩溃问题

代码如下:

#include "mainwindow.h"
#include <QComboBox>
#include <QProxyStyle>
#include <QVBoxLayout>
#include <QApplication>

class JeComboBoxNoPopupStyle : public QProxyStyle
{
public:
    explicit JeComboBoxNoPopupStyle(QStyle *baseStyle) : QProxyStyle(baseStyle) {}

    int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, const QWidget *widget = nullptr,
                  QStyleHintReturn *returnData = nullptr) const override
    {
        if (hint == QStyle::SH_ComboBox_Popup) {
            return 0;
        }
        return QProxyStyle::styleHint(hint, option, widget, returnData);
    }
};

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    auto body = new QWidget(this);
    this->setCentralWidget(body);
    auto vlay = new QVBoxLayout(body);
    auto combo = new QComboBox(body);
    auto *comboStyle = new JeComboBoxNoPopupStyle(combo->style());
    comboStyle->setParent(combo);
    combo->setStyle(comboStyle);
    combo->setMaxVisibleItems(3);
    combo->addItems(QStringList()<<"Item1"<<"Item2"<<"Item3"<<"Item4"<<"Item5");
    vlay->addWidget(combo);
    vlay->addStretch(1);
    this->resize(300, 200);
}

MainWindow::~MainWindow() = default;

如果设置了comboStyle->setParent(combo); 程序会在这个控件析构时崩溃,排查下来,和传入的combo->style()有关,要么是里面有全局的东西,不能在这里被delete,要么析构时也需要用到style。

这里不传入style()是不会崩的,但是项目里的控件有自定义的样式,不传会变成默认的样式。

最后是改成了comboStyle->setParent(qApp);


Comment