Установка минимальной ширины QPushButton при сохранении поведения по умолчанию MinimumSizeHint - PullRequest
0 голосов
/ 08 мая 2019

В моем приложении мне нужно, чтобы все QPushButton s имели ширину не менее 150px, но больше, если это необходимо.Для этого я использую глобальную таблицу стилей (которая содержит много других свойств) с этим простым ограничением:

QPushButton {
    min-width: 150px;
}

Дело в том, что мне также нужны кнопки с текстом, который не помещается внутри 150px, чтобыбыть не в состоянии сжаться до ширины, ниже которой весь текст не будет отображаться.
Предполагается, что это нормальное поведение для QPushButton, но проблема в том, что, как объяснено в документации для minimalSizeHint () :

QLayout никогда не изменит размердля виджета с размером меньше минимального размера подсказка , если для параметра minSize () не установлено значение или для политики размера не задано значение QSizePolicy :: Ignore. Если задано минимальное значение размера (), подсказка о минимальном размере будет игнорироваться.

В некоторых случаях это приводит к тому, что кнопки с длинным текстом при запуске отображаются с нужным размером, нопри уменьшении окна кнопка становится слишком маленькой, чтобы отобразить весь текст.
Я подготовил простой пример, показывающий это поведение:

#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();
}

Я думал об использовании динамических свойств установить ограничение минимальной ширины только для кнопок с базовой шириной <150px, но это не представляется возможным. <br>
Есть ли способ сделать то, что я хочу, с помощью таблиц стилей, или у меня естьсоздать подкласс QPushButton и переопределить метод minimumSizeHint() (которого я хотел бы избежать, поскольку мне пришлось бы заменить множество кнопок в моем приложении)?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Было бы лучше, если вы подкласс QPushButton. Но есть 2 способа обойти эту проблему:

  1. Вы можете strip длинный текст с определенным количеством символов и использовать функцию setToolTip(QString) для отображения полного текста, когда мышь введет кнопку.

  2. Вы можете переопределить родительский виджет resizeEvent и можете проверить ширину и перейти к подходу № 1, если размер становится действительно маленьким.

  3. Используйте пример Elide Text , чтобы получить представление об elide для QPushButton . Не уверен, что это сработает.

0 голосов
/ 09 мая 2019

Мне не удалось найти способ сделать это, используя только таблицы стилей, но вот решение, которое я нашел, подклассами 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 ниже 150 пикселей будут принудительно установлены на этот размер, более крупные сохранят стандартное поведение QPushButton.

...