在我的应用程序中,我需要所有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()
方法(我想避免这种方法,因为我必须替换应用程序中的许多按钮) ?
答案 0 :(得分:1)
最好将QPushButton子类化。但是,有2个解决此问题的方法:
您可以将长文本strip
设置为特定数量的字符,并使用setToolTip(QString)
功能在鼠标进入按钮时显示全文。
您可以覆盖父窗口小部件resizeEvent
,并且可以检查宽度,如果尺寸真的很小,可以使用方法1。
使用省略文字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的默认行为。