代码如下:
#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);
