2011-07-10 19 views
9

Creé 2 filas de botones, cada fila está dentro de un QHBoxLayout. enter image description hereTamaño/ancho mínimo de un QPushButton creado a partir del código

puedo crear los botones en el código:

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

El problema es que no pueden contraerse (cuando el usuario cambia el tamaño de la ventana) más allá de ese tamaño, aunque su texto encajaría en una ancho mucho más pequeño. Si creo los botones manualmente en el editor de recursos en lugar de hacerlo en el código, pueden tener un ancho menor que ese.

+4

Probar con QToolButton. –

+0

¡Eso funcionó! Gracias. Si publica esto como respuesta, puedo seleccionarlo como la respuesta aceptada. ¿Pero por qué el redimensionamiento funciona para QToolButton pero no para QPushButton? – sashoalm

+0

QToolButton y QPushButton tienen diferentes "estilos" predeterminados. Por ejemplo, un QPushButton tiene un ancho mínimo de aproximadamente 6em. Es decir, el ancho de 6 caracteres (en la fuente que está usando). QToolButton, porque generalmente se usa para imágenes, o "...", cosas así, tiene un ancho mínimo mucho más pequeño, como 2em. QPushButton, también suele tener más márgenes izquierdos/derechos. Si comienzas a jugar con hojas de estilo, esto es algo con lo que puedes jugar. – Liz

Respuesta

6

Esto sucede porque el minimumSizeHint del QPushButton no permite la QLayout para cambiar su tamaño:

La implementación predeterminada de minimumSizeHint() devuelve un tamaño no válido si no hay un diseño para este widget, y vuelve el tamaño de la disposición es lo contrario. La mayoría de los widgets incorporados vuelven a implementar minimumSizeHint().

QLayout nunca va a cambiar el tamaño de un widget a un tamaño menor que el mínimo atisbo tamaño a menos minimumSize() se establece la política o el tamaño se establece en QSizePolicy :: Ignorar. Si se establece minimumSize(), se ignorará la sugerencia de tamaño mínimo .

La solución más simple es fijar el ancho mínimo de forma explícita:

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

Como escribieron pnezis, es probable que desee para anular el tamaño mínimo predeterminado calculado por el botón. Aquí está una manera que puede hacerlo evitando al mismo tiempo para elegir un tamaño arbitrario que podría no funcionar cuando las condiciones varían (distinta de la fuente o el tamaño de fuente, estilo de interfaz de usuario, 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)); 

Lo anterior fue adaptada y simplificada de QPushButton propio código. Es posible que desee consultar la fuente de QPushButton :: sizeHint para obtener todos los detalles.

1

setMaximumWidth funciona para mí. código de ejemplo está en pyqt, pero debe traducirse directamente a C++ sin ningún problema.

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