【问题标题】:Increase space between text and checkbox in Qt在 Qt 中增加文本和复选框之间的空间
【发布时间】:2012-09-26 07:57:12
【问题描述】:

如果您设置固定的复选框大小,则文本将与复选框本身对齐。使用标准布局方向,文本将在框之后开始,而对于 从右到左 布局,它将在框之前结束,就像这样(边框只是小部件的边框指示小部件的实际尺寸,不要混淆):

有没有办法将文本与另一侧对齐来实现这一点:

【问题讨论】:

  • 你为什么不直接创建没有任何文本的复选框并在其中添加标签,你可以在任何你想要的地方对齐?
  • @Blood:(可能取决于样式),复选框的正常行为是您也可以单击标签来切换复选框。所以你至少需要一些额外的代码。
  • @Andreas,是的,这是原因之一。另一个是我的复选框会动态定位,分别定位复选框和对应的标签很烦人

标签: c++ qt qcheckbox


【解决方案1】:

正如您提到的,您有一个固定大小的 QCheckBox。无需子类化,您就可以使用样式表轻松实现您想要的 QCheckBox。但不幸的是,text-align 属性只适用于 QPushButtonQProgressBar。但是您可以使用的备用样式表是:

QCheckBox{
spacing:100px;
}

使用 QCheckBox 的 RightToLeft 方向和此样式表,您的复选框已准备就绪! :) 。根据您的应用更改间距
希望这会有所帮助。

【讨论】:

  • 谢谢,如果与QFontMetrics 结合使用,这是一个很好的解决方案:int width = box->fontMetrics().width(str); QString spacing = "QCheckBox{spacing:%1px}"; box->setStyleSheet( spacing.arg(box->width() - width - 25) );
【解决方案2】:

您可以尝试从 QCheckBox 继承并绘制您想要的内容。查看此示例自定义 push_button(为按钮上的文本添加阴影)。

#include "CustomButton.h"
#include <QStylePainter>
#include <QStyleOptionButton>
#include <QMenu>


CustomButton::CustomButton(QWidget *parent):
    QPushButton(parent)
{
}

void CustomButton::paintEvent(QPaintEvent *event)
{
    QStylePainter p(this);
    QFontMetrics font = this->fontMetrics();

    QRect textRect = font.boundingRect(text());
    int x = rect().center().x()-textRect.center().x();
    int y = rect().center().y()-textRect.center().y();
    ++y;
    p.drawControl(QStyle::CE_PushButton, getStyleOption()); //draw button with stylesheet
    QStyleOptionButton opt = getStyleOption();
    opt.text = text();
    QPen tempPen = p.pen();
    p.setPen(Qt::white);
    p.drawText(x, y,  text()); //draw text shadow on the button
    p.setPen(tempPen);
    p.drawControl(QStyle::CE_PushButtonLabel, opt); //draw text with stylesheet 
    //QPushButton::paintEvent(event);
}

QStyleOptionButton CustomButton::getStyleOption() const
{
    QStyleOptionButton opt;
    opt.initFrom(this);
    opt.features = QStyleOptionButton::None;
    if (isFlat())
        opt.features |= QStyleOptionButton::Flat;
    if (menu())
        opt.features |= QStyleOptionButton::HasMenu;
    if (autoDefault() || isDefault())
        opt.features |= QStyleOptionButton::AutoDefaultButton;
    if (isDefault())
        opt.features |= QStyleOptionButton::DefaultButton;
    if (isDown() || (menu() && menu()->isVisible()))
        opt.state |= QStyle::State_Sunken;
    if (isChecked())
        opt.state |= QStyle::State_On;
    if (!isFlat() && !isDown())
        opt.state |= QStyle::State_Raised;
    //opt.text = text();
    opt.icon = icon();
    opt.iconSize = iconSize();

    return opt;
}

【讨论】: