gpt4 book ai didi

c++ - 如何使 QComboBox 的文本加粗,而不是列表项?

转载 作者:太空狗 更新时间:2023-10-29 22:56:19 25 4
gpt4 key购买 nike

我们的 UI 中有一个长期约定,即项目在已更改但尚未提交更改时以粗体显示。奇怪的是,直到现在我们还没有使用任何组合框,但我现在有一个用途并且需要实现这种行为。所以我需要以编程方式将关闭的组合框显示的文本加粗(然后取消加粗)。但是,我不想在弹出窗口中将整个项目列表加粗。如果这样更容易的话,我可以接受将列表中的选定项目加粗。

我看到很多答案几乎都是这样做的,但通常是尝试修改列表项而不是按钮。我已经尝试了其中大多数的变体;不幸的是,我没有保留我尝试过的记录。对于它的值(value),我的代码目前看起来像:

myCombo->setStyleSheet(
"QComboBox {font-weight: bold;} "
"QComboBox QAbstractItemView::item {font-weight: normal;}"
);

这会将按钮变为粗体,但也会将列表项变为粗体。当我将正常权重应用于没有 ::itemQAbstractItemView 时,以及当我尝试基于 :open< 的不同技术时,会看到相同的行为:closedQComboBox 上。

我会说我是 Qt 的新手。我在 Fedora 26 上使用 Qt5,但将部署到 CentOS 7。

最佳答案

似乎在 QComboBox 中设置字体样式会覆盖 View (恕我直言,这不应该)。

但是,当我尝试以这种方式显式设置组合框的 View 时:

  view = new QListView();
myCombo->setView(view);

OP 发布的样式表突然起作用了。

顺便说一句,新 View 与原始 View 不同(例如,有白色背景等),我猜 OP 对此不满意。当然,人们可以继续设计它的样式,但人们更愿意使用具有一致风格的即用型 View 。

检查默认的 QComboBox View :

QComboBox * combo = new QComboBox();
qDebug() << combo->view();

产生这个:

QComboBoxListView(0x2091880)

所以,有一个特定的 QComboBoxListView 类,它在文档中无处可寻,在 qcombobox_p.h 中定义,不是一个可以包含的文件,真的, 但至少我们可以在 viewOptions 覆盖的方法中理解问题出在哪里:

    QStyleOptionViewItem option = QListView::viewOptions();
option.showDecorationSelected = true;
if (combo)
option.font = combo->font(); // <--- here
return option;

combo 是指向QComboBox 的私有(private)指针,在构造中初始化:

    QComboBoxListView(QComboBox *cmb = 0) : combo(cmb) {}

它将始终用自己的字体覆盖 View 选项字体。

让我们复制一份 QComboBoxListView 类,对其进行编辑和重命名:

comboitemview.h

#ifndef COMBOITEMVIEW_H
#define COMBOITEMVIEW_H

#include <QListView>
#include <QComboBox>

class ComboItemView : public QListView
{
Q_OBJECT

QComboBox * _box;
public:
ComboItemView(QComboBox *box);
protected:
void paintEvent(QPaintEvent *event);
void resizeEvent(QResizeEvent *event);
QStyleOptionViewItem viewOptions() const;
};

#endif // COMBOITEMVIEW_H

comboitemview.cpp

#include "comboitemview.h"

#include <QPaintEvent>
#include <QPainter>

ComboItemView::ComboItemView(QComboBox * box = 0) : _box(box){}

void ComboItemView::paintEvent(QPaintEvent *event)
{
if (_box)
{
QStyleOptionComboBox opt;
opt.initFrom(_box);
opt.editable = _box->isEditable();
if (_box->style()->styleHint(QStyle::SH_ComboBox_Popup, &opt, _box))
{
QStyleOptionMenuItem menuOpt;
menuOpt.initFrom(this);
menuOpt.palette = palette();
menuOpt.state = QStyle::State_None;
menuOpt.checkType = QStyleOptionMenuItem::NotCheckable;
menuOpt.menuRect = event->rect();
menuOpt.maxIconWidth = 0;
menuOpt.tabWidth = 0;
QPainter p(viewport());
_box->style()->drawControl(QStyle::CE_MenuEmptyArea, &menuOpt, &p, this);
}
}
QListView::paintEvent(event);
}

void ComboItemView::resizeEvent(QResizeEvent *event)
{
resizeContents(viewport()->width(), contentsSize().height());
QListView::resizeEvent(event);
}

QStyleOptionViewItem ComboItemView::viewOptions() const
{
QStyleOptionViewItem option = QListView::viewOptions();
option.showDecorationSelected = true;
return option;
}

最后用它来设置 View 字体的样式:

    myCombo->setView(new ComboItemView(myCombo));
myCombo->setStyleSheet(
"QComboBox {font-weight: bold;} "
"QComboBox QAbstractItemView {font-weight: normal;}"
);

关于c++ - 如何使 QComboBox 的文本加粗,而不是列表项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48526227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com