#include "mainwindow.h" #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { this->setMinimumSize({500, 300}); auto container = new QWidget(); this->setCentralWidget(container); auto layout = new QHBoxLayout(); container->setLayout(layout); auto comboBox = new QComboBox(); comboBox->installEventFilter(this); comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); layout->addWidget(comboBox); layout->addStretch(); auto model = new QStandardItemModel(); comboBox->setModel(model); // minimum sizehint should be updated when we insert the item (just like the normal sizehint) auto insertButton = new QPushButton("insert item"); connect(insertButton, &QPushButton::clicked, model, [model]() { model->appendRow(new QStandardItem("10")); }); layout->addWidget(insertButton); // a style change event is the only thing that clears the minimum sizehint cache auto polishButton = new QPushButton("style change event"); connect(polishButton, &QPushButton::clicked, comboBox, [comboBox]() { QEvent styleChange{QEvent::StyleChange}; qApp->sendEvent(comboBox, &styleChange); }); layout->addWidget(polishButton); } MainWindow::~MainWindow() { } bool MainWindow::eventFilter(QObject* watched, QEvent* event) { if(event->type() == QEvent::ToolTip && watched->isWidgetType()) { const auto he = static_cast(event); const auto comboBox = static_cast(watched); const auto minSizeHint = comboBox->minimumSizeHint(); const auto msg = QString("{%1, %2}").arg(minSizeHint.width()).arg(minSizeHint.height()); QToolTip::showText(he->globalPos(), msg); event->accept(); return true; } return false; }