Taille/largeur minimale d'un QPushButton créé à partir d'un code

j'ai créé 2 lignes de boutons-poussoirs, chaque ligne est à l'intérieur D'un QHBoxLayout. enter image description here

je crée les boutons dans le code:

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

le problème est qu'ils ne peuvent pas rétrécir (lorsque l'utilisateur redimensionne la boîte de dialogue) au-delà de cette taille, même si leur texte s'insérerait dans une largeur beaucoup plus petite. Si je crée les boutons manuellement dans l'éditeur de ressources au lieu de dans le code, ils peuvent avoir une largeur plus petite que cela.

10
demandé sur sashoalm 2011-07-10 07:33:32

3 réponses

Cela se produit parce que le minimumSizeHintQPushButton ne permet pas le QLayout pour le redimensionner:

l'implémentation par défaut de minimumSizeHint () renvoie une valeur non valide taille s'il n'y a pas de layout pour ce widget, et renvoie le taille minimale autrement. La plupart des widgets intégrés minimumSizeHint ().

QLayout ne redimensionnera jamais un widget à une taille inférieure au minimum indication de taille à moins que minimumSize() ne soit défini ou que la Politique de taille ne soit définie est fixé à QSizePolicy:: Ignore. Si minimumSize () est défini, la taille minimale indique sera ignoré.

la solution simple est de définir explicitement la largeur minimale:

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);
}
6
répondu pnezis 2011-11-16 20:42:51

comme l'a écrit pnezis, vous voulez probablement annuler la taille minimale par défaut calculée par le bouton. Voici un moyen de le faire tout en évitant de choisir une taille arbitraire qui pourrait ne pas fonctionner lorsque les conditions varient (police ou taille de police différente, style D'interface utilisateur, etc.):

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

ce qui précède a été adapté et simplifié à partir du propre code de QPushButton. Vous pouvez regarder la source de QPushButton:: sizeHint pour tous les détails.

4
répondu Paulo 2013-10-21 18:56:41

setMaximumWidth fonctionne pour moi. exemple de code est dans pyqt, mais il devrait se traduire directement en C++ sans aucun problème.

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_())
1
répondu user178047 2014-03-11 03:23:54