Минимальный размер / ширина QPushButton, созданной из кода

Я создал 2 строки кнопок, каждая строка находится внутри QHBoxLayout. enter image description here

Я создаю кнопки в коде:

static const char* buttonText = "23456789TJQKA";
for (int ii = 0; buttonText[ii]; ii++)
{
    QPushButton* pushButton = new QPushButton(this);
    pushButton->setText(QString(buttonText[ii]));
    ui->horizontalLayout_1->addWidget(pushButton);
}
for (int ii = 0; buttonText[ii]; ii++)
{
    QPushButton* pushButton = new QPushButton(this);
    pushButton->setText(QString(buttonText[ii]));
    ui->horizontalLayout_2->addWidget(pushButton);
}

проблема в том, что они не могут сжиматься (когда пользователь изменяет размер диалога) за пределами этого размера, даже если их текст будет соответствовать гораздо меньшей ширине. Если я создам кнопки вручную в Редакторе ресурсов, а не в коде, они могут иметь меньшую ширину.

3 ответов


это происходит потому, что minimumSizeHint на QPushButton не дает QLayout изменить это :

реализация minimumSizeHint() по умолчанию возвращает недопустимый размер, если для этого виджета нет макета, и возвращает макет минимальный размер, в противном случае. Большинство встроенных виджетов переопределить minimumSizeHint().

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

простое решение состоит в том, чтобы установить минимальную ширину явно:

static const char* buttonText = "23456789TJQKA";
for (int ii = 0; buttonText[ii]; ii++)
{
   QPushButton* pushButton = new QPushButton(this);
   pushButton->setMinimumWidth(5);
   pushButton->setText(QString(buttonText[ii]));
   ui->horizontalLayout_1->addWidget(pushButton);
}
for (int ii = 0; buttonText[ii]; ii++)
{
   QPushButton* pushButton = new QPushButton(this);
   pushButton->setMinimumWidth(5);
   pushButton->setText(QString(buttonText[ii]));
   ui->horizontalLayout_2->addWidget(pushButton);
}

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

QWidget* parent = /* some widget */
auto button = new QPushButton(QLatin1String("X"), parent);
auto textSize = button->fontMetrics().size(Qt::TextShowMnemonic, button->text());
QStyleOptionButton opt;
opt.initFrom(button);
opt.rect.setSize(textSize);
button->setMinimumSize(
  button->style()->sizeFromContents(QStyle::CT_PushButton,
                                    &opt,
                                    textSize,
                                    button));

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


setMaximumWidth работает для меня. пример кода находится в pyqt, но он должен переводиться непосредственно на C++ без каких-либо проблем.

from PyQt4 import QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        layout = QtGui.QHBoxLayout()
        texts = [":)",
                 "&Short",
                 "&Longer",
                 "&Different && text",
                 "More && text",
                 "Even longer button text", ]
        for text in texts:
            btn = QtGui.QPushButton(text)
            double = text.count('&&')
            text = text.replace('&', '') + ('&' * double)
            width = btn.fontMetrics().boundingRect(text).width() + 7
            btn.setMaximumWidth(width)
            layout.addWidget(btn)
        self.setLayout(layout)

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)
    mainWin = Window()
    mainWin.show()
    sys.exit(app.exec_())