Qt QComboBox仅首个选项可见问题求助:字体大小下拉框异常
Qt字体大小下拉框仅显示第一个选项的问题排查与解决
我在学习Qt并提升C++技能,开发一款简易文本编辑器时,通过以下代码创建字体大小下拉框QComboBox:
QComboBox *sizeComboBox = new QComboBox(this); attributeToolBar->addWidget(sizeComboBox); for (int i = 8; i <= 48; i += 2) sizeComboBox->addItem(QString::number(i)); connect(sizeComboBox, &QComboBox::currentTextChanged, this, &MainWindow::setFontSize);
所有选项已填充完成,但界面上仅第一个选项(8)可见,下拉按钮被挤压无法正常点击展开:

我已经查阅网络资料、咨询相关工具并浏览技术社区,但仍未找到问题原因及解决方案,以下是完整的MainWindow.cpp代码:
//TextEditor - just a simple text editor with various features // by Hans Yunge 11/11/2024 #include "mainwindow.h" #include "./ui_mainwindow.h" #include <QFileDialog> #include <QToolBar> #include <QFont> #include <QFontComboBox> //Main MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); textEditorToolBar(); MainWindow::initializeDocument(); } MainWindow::~MainWindow() { delete ui; } //Actions void MainWindow::on_actionNew_triggered() { } void MainWindow::on_actionSave_triggered() { QString fileName; if (currentFileName.isEmpty() || currentFileName.isNull()){ fileName = QFileDialog::getSaveFileName(this, "Open File", "C:\\Users\\hyung\\OneDrive\\Documents", "All Files (*)"); } else { fileName = QFileDialog::getSaveFileName(this, "Open File", currentFileName); } QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)){ QTextStream out(&file); out << ui->documentEditor->toHtml(); file.close(); } } void MainWindow::on_actionOpen_triggered() { QString fileName = QFileDialog::getOpenFileName(this, "Open File", "C:\\Users\\hyung\\OneDrive\\Documents", "All Files (*)"); QFile file(fileName); currentFileName = fileName; if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); QString tempString = in.readAll(); ui->documentEditor->setHtml(tempString); file.close(); } } void MainWindow::initializeDocument(){ ui->documentEditor->setAcceptRichText(true); ui->documentEditor->setHtml("<p>Beginning typing at will</p>"); } void MainWindow::textEditorToolBar() { QToolBar *attributeToolBar = addToolBar("Document Attributes"); // Actions QAction *boldAction = attributeToolBar->addAction("Bold"); QAction *italicAction = attributeToolBar->addAction("Italic"); QAction *underlineAction = attributeToolBar->addAction("Underline"); // Connecting to slots connect(boldAction, &QAction::triggered, this, &MainWindow::setBold); connect(italicAction, &QAction::triggered, this, &MainWindow::setItalic); connect(underlineAction, &QAction::triggered, this, &MainWindow::setUnderline); // Font Drop Down QFontComboBox *fontComboBox = new QFontComboBox(this); attributeToolBar->addWidget(fontComboBox); connect(fontComboBox, &QFontComboBox::currentFontChanged, this, &MainWindow::setFont); // Font Size Drop Down QComboBox *sizeComboBox = new QComboBox(this); attributeToolBar->addWidget(sizeComboBox); for (int i = 8; i <= 48; i += 2) sizeComboBox->addItem(QString::number(i)); connect(sizeComboBox, &QComboBox::currentTextChanged, this, &MainWindow::setFontSize); } void MainWindow::setItalic(){ QTextCursor cursor = ui->documentEditor->textCursor(); QTextCharFormat format; format.setFontItalic(!cursor.charFormat().fontItalic()); cursor.mergeCharFormat(format); } void MainWindow::setUnderline(){ QTextCursor cursor = ui->documentEditor->textCursor(); QTextCharFormat format; format.setFontUnderline(!cursor.charFormat().fontUnderline()); cursor.mergeCharFormat(format); } void MainWindow::setBold(){ QTextCursor cursor = ui->documentEditor->textCursor(); QTextCharFormat format; format.setFontWeight(cursor.charFormat().fontWeight() == QFont::Bold ? QFont::Normal : QFont::Bold); cursor.mergeCharFormat(format); } void MainWindow::setFontSize(const QString &size){ bool ok; int fontSize = size.toInt(&ok); if (ok && fontSize > 0) { QTextCursor cursor = ui->documentEditor->textCursor(); QTextCharFormat format; format.setFontPointSize(fontSize); cursor.mergeCharFormat(format); } } void MainWindow::setFont(const QFont &font){ QTextCursor cursor = ui->documentEditor->textCursor(); QTextCharFormat format; format.setFont(font); // Use setFont() to apply the entire QFont, including family cursor.mergeCharFormat(format); }
解决方法
问题根源是QComboBox添加到QToolBar后,默认宽度仅适配第一个选项的内容,导致下拉按钮被挤压隐藏,无法展开查看其他选项。可以通过以下两种方式修复:
方式1:设置最小宽度
在创建sizeComboBox后,添加一行设置最小宽度的代码,确保控件有足够空间显示下拉按钮:
QComboBox *sizeComboBox = new QComboBox(this); sizeComboBox->setMinimumWidth(60); // 设置合适的最小宽度 attributeToolBar->addWidget(sizeComboBox);
方式2:设置自动调整宽度策略
让QComboBox根据内容自动调整宽度,确保所有选项的宽度都能被适配:
QComboBox *sizeComboBox = new QComboBox(this); sizeComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); attributeToolBar->addWidget(sizeComboBox);
两种方式都能解决仅显示第一个选项的问题,推荐使用方式2,它会根据下拉框内的内容自动适配最优宽度。
内容的提问来源于stack exchange,提问作者denver-coder
相关产品推荐
相关产品推荐

