2010-02-04 17 views
7

Ich versuche programmaticaly (mit Qt 4.6) ein Fenster zu erstellen, das eine Reihe von QPushButton 's enthält, alle zusammen verpackt. Es sollte wie so aussehen (was ich eine Toolbox nennen):Entfernen Sie alle Abstände in QGridLayout

toolbox image http://img99.imageshack.us/img99/9853/examplezk.png

Also, ich habe eine Toolbox-Klasse erstellt, von QWidget ableiten, die den folgenden Konstruktor hat:

Toolbox::Toolbox (void) 
    : QWidget (0, Qt::Tool) 
{ 
    setWindowTitle (tr ("Toolbox")); 

    QGridLayout *group = new QGridLayout (this); 
    group->setSpacing (0); 
    group->setContentsMargins (0, 0, 0, 0); 
    group->setSizeConstraint (QLayout::SetFixedSize); 
    setLayout (group); 

    unsigned k = 0; 
    QPushButton *buttons = new QPushButton[6]; 
    for (unsigned i = 0; i < 3; i++) 
    for (unsigned j = 0; j < 2; j++) 
    { 
     buttons[k].setIcon (QIcon ("test.png")); 
     buttons[k].setIconSize (QSize (32, 32)); 
     buttons[k].setContentsMargins (0, 0, 0, 0); 
     buttons[k].setCheckable (true); 
     buttons[k].setAutoExclusive (true); 

     group->addWidget (&buttons[k], i, j); 
     k++; 
    } 
    buttons[1].setChecked (true); 

Irgendwie es funktioniert nicht und meine Knöpfe am Ende nicht zusammengepackt:

result http://img9.imageshack.us/img9/774/resultr.png

ich kann nicht entfernen verwalten diese ve rischer Abstand (und die Ränder, die das gesamte Array umgeben). Jede Hilfe ist willkommen.

Antwort

1

Scheinbar ist dies eine normale Sache: siehe die entsprechende bug report, die geschlossen wurde. Die dort gemeldete Problemumgehung scheint für mich nicht zu funktionieren.

+0

Der Link ist jetzt tot. – Trilarion

+0

Arbeitslink: https://bugreports.qt.io/browse/QTBUG-2699 – Taran

0

Da Sie die Größenbeschränkung für das Layout auf QLayout::SetFixedSize festgelegt haben, verwendet Qt den Größenhinweis des Widgets als feste Größe. Sie müssen möglicherweise QWidget::sizeHint() in der Klasse Toolbox überschreiben, um das Widget genau so groß zu machen, wie es für alle Schaltflächen erforderlich ist (im Fall Ihrer sechs Schaltflächen wäre die Breite 64 und die Höhe wäre 96).

+0

Hum, ich fürchte, es kommt nicht ins Spiel. Ich habe eine Toolbox :: sizeHint() hinzugefügt, aber sie wird nicht aufgerufen. –

+0

Toolbox :: sizeHint() wird aufgerufen, wenn ich es versuche. Es wird nicht aufgerufen, wenn ich vergesse, es zu einer konstanten Elementfunktion zu machen. Sie werden wahrscheinlich auch den Stil ändern müssen, wie es PiedPiper vorschlägt. –

+0

OK, richtig, ein weiterer Fall, in dem verschiedene Dateien bearbeitet und kompiliert werden, tut mir leid. (Ich habe aber das 'const' Recht.) Aber selbst wenn es aufgerufen wird, kann es die QSize zurückgeben, die ich will, und ich ändere das Aussehen überhaupt nicht. Schließlich, in Bezug auf die Einstellung des Stils, wenn ich das tun, dann ist kein anderer Trick erforderlich (aber es ist hässlich). –

0

Wenn Sie den Plastique-Stil verwenden, der jetzt standardmäßig in Qt4.6 verwendet wird, werden die Rahmen von QPushButtons innerhalb des Widgets gezeichnet. Versuchen Sie es mit einem der anderen Stile. z.B .:

#include <QGtkStyle> 

QApplication a(argc, argv, true); 
a.setStyle("gtk"); 

Ein Stil auch auf individueller Widget eingestellt werden kann, die QWidget :: setStyle() Funktion.

+0

Ich arbeite an Mac OS, also verwende ich keine Plastique. Wenn Sie den Stil auf plastique einstellen, werden Widgets zusammengepackt. Dies gibt ihnen jedoch ein fremdartiges Aussehen, so dass ich immer noch eine Lösung mit dem einheimischen Typ begrüßen würde. –

Verwandte Themen