gpt4 book ai didi

c++ - 如何将图标添加到 QGroupBox 标题?

转载 作者:搜寻专家 更新时间:2023-10-31 00:07:38 39 4
gpt4 key购买 nike

是否可以向 QGroupBox 标题添加图标(以编程方式,通过 QtCreator,有或没有样式表)?

我想在我的 GUI 中一些 QGroupBoxes 的标题附近放置一个标记。最佳位置是标题的右侧,但任何其他合理的位置(标题左侧或小部件的右上角)也可能有效。

我能想到的唯一方法是创建一个带有图标的 QLabel 并将其可视化地放置在 QGroupBox 顶部所需的位置。但我发现这是一个丑陋的解决方案。

编辑

我知道有一种方法可以使用样式表设置用于checkable QGroupBoxes 的indicator,就像任何图像一样,用于选中和未选中状态。但是QGroupBox必须是可检查的,等等。我想在QGroupBox的可检查性上独立添加这个标记(小图)。

最佳答案

背景

不幸的是,QGroupBox 没有setIcon 方法,而QPushButton 有。

一个可能的解决方案是使用QGroupBox::setCheckable 使QGroupBox 可检查。并使用 stylesheet 将自定义图像设置为指示器像这样:

QGroupBox::indicator:unchecked {
image: url(:/images/checkbox_unchecked.png);
}

但是,当复选框未选中时,这将使整个组框禁用。

解决方案

考虑到这一背景,我建议您采用一个相当复杂但又非常灵活的解决方案,包括以下步骤:

  1. 子类 QStyleOptionGroupBox并将附加变量声明为公共(public)类属性:

    QPixmap pixmap;
    int offset;
    int leftSpace;
    int rightSpace;

    这些将用于将装饰像素图以及放置设置传递给样式。

  2. 子类 QCommonStyle 并重新实现 QCommonStyle::drawComplexControl像这样:

    if (const StyleOptionDecoratedGroupBox *groupBox = qstyleoption_cast<const StyleOptionDecoratedGroupBox *>(opt)) {
    QRect textRect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxLabel, widget);
    QRect checkBoxRect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxCheckBox, widget);
    int decorationOffset = 0;
    int pixmapRectWidth = 0;
    int pixmapHeight = 0;
    int textOffset = 0;

    if (!groupBox->pixmap.isNull()) {
    decorationOffset = groupBox->offset;
    pixmapRectWidth = groupBox->leftSpace
    + groupBox->pixmap.width()
    + groupBox->rightSpace;
    pixmapHeight = groupBox->pixmap.height();
    textOffset = decorationOffset + pixmapRectWidth;
    }

    textRect.adjust(textOffset, 0, textOffset, 0);

    // Draw frame
    if (groupBox->subControls & QStyle::SC_GroupBoxFrame) {
    QStyleOptionFrame frame;
    frame.QStyleOption::operator=(*groupBox);
    frame.features = groupBox->features;
    frame.lineWidth = groupBox->lineWidth;
    frame.midLineWidth = groupBox->midLineWidth;
    frame.rect = proxy()->subControlRect(CC_GroupBox, opt, SC_GroupBoxFrame, widget);
    p->save();
    QRegion region(groupBox->rect);
    if (!groupBox->text.isEmpty()) {
    bool ltr = groupBox->direction == Qt::LeftToRight;
    QRect finalRect;
    if (groupBox->subControls & QStyle::SC_GroupBoxCheckBox) {
    finalRect = checkBoxRect.united(textRect);
    finalRect.adjust(ltr ? -4 : 0, 0, ltr ? 0 : 4, 0);
    } else {
    finalRect = textRect;
    }
    region -= finalRect;
    }
    p->setClipRegion(region);
    proxy()->drawPrimitive(PE_FrameGroupBox, &frame, p, widget);
    p->restore();
    }

    // Draw icon
    if (!groupBox->pixmap.isNull()) {
    p->fillRect(decorationOffset, 0, pixmapRectWidth, pixmapHeight, opt->palette.window().color());
    proxy()->drawItemPixmap(p, QRect(decorationOffset, 0, pixmapRectWidth, pixmapHeight),
    Qt::AlignCenter, groupBox->pixmap);
    }

    // Draw title
    if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
    QColor textColor = groupBox->textColor;
    if (textColor.isValid())
    p->setPen(textColor);
    int alignment = int(groupBox->textAlignment);
    if (!proxy()->styleHint(QStyle::SH_UnderlineShortcut, opt, widget))
    alignment |= Qt::TextHideMnemonic;
    proxy()->drawItemText(p, textRect, Qt::TextShowMnemonic | Qt::AlignHCenter | alignment,
    groupBox->palette, groupBox->state & State_Enabled, groupBox->text,
    textColor.isValid() ? QPalette::NoRole : QPalette::WindowText);
    if (groupBox->state & State_HasFocus) {
    QStyleOptionFocusRect fropt;
    fropt.QStyleOption::operator=(*groupBox);
    fropt.rect = textRect;
    proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, p, widget);
    }
    }
    } else {
    QCommonStyle::drawComplexControl(cc, opt, p, widget);
    }
  3. 子类QGroupBox 并重新实现QGroupBox::paintEvent像这样:

    CustomStyle style;
    QPainter painter(this);
    StyleOptionDecoratedGroupBox option;

    initStyleOption(&option);
    option.pixmap = m_pixmap;
    option.offset = m_offset;
    option.leftSpace = m_leftSpace;
    option.rightSpace = m_rightSpace;

    style.drawComplexControl(QStyle::CC_GroupBox, &option, &painter, this);

注意:当组框处于选中状态时,此解决方案效果不佳。

例子

该解决方案需要大量工作,但幸运的是我已经为您创建了必要的类,以及如何在您自己的项目中使用它们的完整示例。该代码可在 GitHub 上找到.

结果

提供的示例产生以下结果:

Window with a decorated group box and radio buttons

关于c++ - 如何将图标添加到 QGroupBox 标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52626143/

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