从代码创建的QPushButton的最小大小/宽度

时间:2011-07-10 03:33:33

标签: c++ qt button resize

我创建了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 个答案:

答案 0 :(得分:7)

这是因为minimumSizeHint的{​​{1}}不允许QPushButton调整其大小:

  

minimumSizeHint()的默认实现返回无效   如果此窗口小部件没有布局,则返回大小,并返回布局   否则最小尺寸。大多数内置小部件重新实现   的minimumSizeHint()。

     

QLayout永远不会将小部件的大小调整为小于最小值的大小   size提示除非设置了minimumSize()或将size策略设置为   QSizePolicy ::忽略。如果设置了minimumSize(),则为最小大小提示   将被忽略。

简单的解决方案是明确设置最小宽度:

QLayout

答案 1 :(得分:4)

正如pnezis所写,您可能希望覆盖按钮计算的默认最小大小。这是一种可以做到这一点的方法,同时避免选择在条件变化时可能不起作用的任意大小(不同的字体或字体大小,UI样式等):

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的来源。

答案 2 :(得分:1)

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