You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)可见,下拉按钮被挤压无法正常点击展开:

仅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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:45:02