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

Posted

技术标签:

【中文标题】从代码创建的 QPushButton 的最小尺寸/宽度【英文标题】:Minimum size/width of a QPushButton that is created from code 【发布时间】:2011-07-10 03:33:32 【问题描述】:

我创建了 2 行按钮,每行都在 QHBoxLayout 内。

我在代码中创建按钮:

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);

问题是它们不能缩小(当用户调整对话框大小时)超出该大小,即使它们的文本可以适应更小的宽度。如果我在资源编辑器中而不是在代码中手动创建按钮,它们的宽度可能会比这更小。

【问题讨论】:

成功了!谢谢。如果您将此作为答案发布,我可以选择它作为接受的答案。但是为什么调整大小对 QToolButton 有效,而对 QPushButton 无效? QToolButton 和 QPushButton 具有不同的默认“样式”。例如,QPushButton 的最小宽度约为 6em。意思是 6 个字符的宽度(在您使用的字体中)。 QToolButton,因为它通常用于图像或“...”之类的东西,所以它的最小宽度要小得多——比如 2em。 QPushButton,通常也有更多的左边距/右边距。如果你开始使用样式表,这是你可以修改的。 您也可以使用 setMinimumSize(QSize&) 来定义最小范围。 【参考方案1】:

这是因为QPushButtonminimumSizeHint 不允许QLayout 调整它的大小:

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

QLayout 永远不会将小部件的大小调整为小于最小值 大小提示,除非设置了 minimumSize() 或大小策略设置为 QSizePolicy::忽略。如果设置了 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);

【讨论】:

【参考方案2】:

正如 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 的源代码以了解所有详细信息。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于从代码创建的 QPushButton 的最小尺寸/宽度的主要内容,如果未能解决你的问题,请参考以下文章

应用样式表时 QPushButton 尺寸发生变化

QPushButton.setMenu (self, QMenu menu) 使用从 Qt Designer 生成的代码

将 QPushButton 宽度缩小到最小

QPushButton 不显示按钮图标

从 PyQt 中的 QPushButton 获取文本

有啥方法可以创建密钥大小为 512 的 JWT 令牌?并更改 AsymmetricSignatureProvider 的默认最小尺寸要求