Минимальный размер / ширина QPushButton, созданного из кода - PullRequest
10 голосов
/ 10 июля 2011

Я создал 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 ]

7 голосов
/ 17 ноября 2011

Это происходит потому, что minimumSizeHint из QPushButton не позволяет QLayout изменить его размер:

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

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

Простое решение заключается в явной установке минимальной ширины:

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);
}
4 голосов
/ 21 октября 2013

Как писал 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 для всех деталей.

1 голос
/ 11 марта 2014

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_())
...