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

sas*_*alm 10 c++ qt resize button

我创建了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);
}
Run Code Online (Sandbox Code Playgroud)

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

pne*_*zis 7

这是因为minimumSizeHintQPushButton不允许QLayout以调整其大小:

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

除非设置了minimumSize()或将size策略设置为QSizePolicy :: Ignore,否则QLayout永远不会将窗口小部件的大小调整为小于最小大小提示的大小.如果设置了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);
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*ulo 5

正如 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));
Run Code Online (Sandbox Code Playgroud)

以上是从 QPushButton 自己的代码改编和简化的。您可能需要查看 QPushButton::sizeHint 的来源以了解所有详细信息。