2011-07-10 30 views
9

2行のプッシュボタンを作成しました。各行はQHBoxLayout内にあります。 enter image description hereコードから作成されたQPushButtonの最小サイズ/幅

私はコード内のボタンを作成します。

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

問題はそのサイズを超えて(ユーザーがダイアログのサイズを変更したときに)彼らは彼らのテキストが中に収まるようにもかかわらず、縮小することができないということですはるかに小さい幅。コードではなく、リソースエディタでボタンを手動で作成すると、ボタンの幅がそれよりも小さくなる可能性があります。

+4

QToolButtonを試してください。 –

+0

それはうまくいった!ありがとう。これを回答として投稿すると、受け入れられた回答として選択することができます。しかし、なぜQToolButtonではリサイズが機能しましたが、QPushButtonでは機能しませんでしたか? – sashoalm

+0

QToolButtonとQPushButtonのデフォルトの「スタイル」が異なります。例えば、QPushButtonの最小幅は約6emです。意味、6文字の幅(使用しているフォント内)。 QToolButtonは、一般的に画像に使用されるため、または「...」などのように、2emのように最小幅がはるかに小さくなります。 QPushButtonは、通常、より多くの左/右マージンも持っています。あなたがスタイルシートで演奏を始めるなら、これはあなたが微妙なことができるものです。 – Liz

答えて

6

QPushButtonminimumSizeHintQLayoutはサイズを変更することはできませんので、これは起こります:

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); 
} 
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のソースを参照してください。

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_()) 
関連する問題