设置QPushButton的最小宽度,同时保持默认的minimumSizeHint行为

时间:2019-05-08 07:28:33

标签: c++ qt qtstylesheets qpushbutton

在我的应用程序中,我需要所有QPushButton的宽度至少为 150px,但如果需要,可以更大。 为此,我使用具有此简单约束的全局样式表(包含许多其他属性):

QPushButton {
    min-width: 150px;
}

问题是,我还希望按钮的文本不能容纳在150px之内,因此不能将其缩小到无法显示整个文本的宽度。
这应该是QPushButton的正常行为,但是问题是,正如minimumSizeHint()的文档中所述:

  

QLayout绝不会将窗口小部件的大小调整为小于最小大小提示的大小,除非设置了minimumSize(),或者将大小策略设置为QSizePolicy :: Ignore。 如果设置了minimumSize(),则最小尺寸提示将被忽略。

在某些情况下,启动时会以适当的大小显示带有长文本的按钮,但是在缩小窗口时,按钮会变得太小而无法显示所有文本。
我准备了一个显示此行为的简单示例:

#include <QWidget>
#include <QApplication>
#include <QHBoxLayout>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget *w = new QWidget();
    QLayout* layout = new QHBoxLayout(w);

    QPushButton* buttonA = new QPushButton("A", w);
    QPushButton* buttonB = new QPushButton("B", w);
    buttonB->setStyleSheet("min-width: 150px");
    QPushButton* buttonC = new QPushButton("Long long text that doesn't fit in 150px", w);
    QPushButton* buttonD = new QPushButton("Very very very long text that doesn't fit in 150px", w);
    buttonD->setStyleSheet("min-width: 150px");

    layout->addWidget(buttonA);
    layout->addWidget(buttonB);
    layout->addWidget(buttonC);
    layout->addWidget(buttonD);

    w->show();

    return a.exec();
}

我考虑过使用dynamic properties来设置最小宽度约束,仅适用于基本宽度<150px的按钮,但这似乎不可行。

有没有一种方法可以做我想要的样式表,还是必须继承QPushButton并重写minimumSizeHint()方法(我想避免这种方法,因为我必须替换应用程序中的许多按钮) ?

2 个答案:

答案 0 :(得分:1)

最好将QPushButton子类化。但是,有2个解决此问题的方法:

  1. 您可以将长文本strip设置为特定数量的字符,并使用setToolTip(QString)功能在鼠标进入按钮时显示全文。

  2. 您可以覆盖父窗口小部件resizeEvent,并且可以检查宽度,如果尺寸真的很小,可以使用方法1。

  3. 使用省略文字example to get idea about elide for QPushButton。不知道这是否行得通。

答案 1 :(得分:0)

我无法找到一种仅使用样式表来实现此目的的方法,但这是我通过子类化QPushButton

提出的解决方案

MyPushButton.h

#include <QPushButton>

class MyPushButton
    : public QPushButton
{
    Q_OBJECT
    Q_PROPERTY(int minWidth READ minWidth WRITE setMinWidth)

public:
    MyPushButton(QWidget* parent = nullptr);
    virtual ~MyPushButton();

    int minWidth() const;
    void setMinWidth(int width);

    virtual QSize minimumSizeHint() const override;

private:
    int _minWidth;
};

MyPushButton.cpp

#include "MyPushButton.h"

MyPushButton::MyPushButton(QWidget* parent)
    : QPushButton(parent)
    , _minWidth(0)
{
}

MyPushButton::~MyPushButton()
{
}

int MyPushButton::minWidth() const
{
    return _minWidth;
}

void MyPushButton::setMinWidth(int width)
{
    _minWidth = width;
}

QSize MyPushButton::minimumSizeHint() const
{
    // if the minimum width is less than minWidth, set it to minWidth
    // else return the default minimumSizeHint
    return QSize(qMax(QPushButton::minimumSizeHint().width(), _minWidth),
        QPushButton::minimumSizeHint().height());
}

stylesheet.qss

MyPushButton {
    qproperty-minWidth: 150;
}

minimumSizeHint宽度小于150px的按钮将被强制设置为该大小,较大的按钮将保留QPushButton的默认行为。