QGridLayout

Alles rund um die Programmierung mit Qt
Antworten
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

QGridLayout

Beitrag von marvin »

Guten Morgen

ich möchte meine UI in einem Gridlayout erstellen, es soll eine art Taschenrechner werden

ich hab zahlen in einem nummernblock (buttons) von 0 - 9
nun möchte ich aber das das fenster nicht selbe höhe und breite hat, sondern fixe 400x200 pixel groß sein wird und dannach skaliert
wie mach ich das ?

QGridLayout *mainLayout = new QGridLayout;
mainLayout->addWidget(digitButtons[0], 5, 1);
....
....



p.s:
mainLayout->setSizeConstraint(QLayout::SetNoConstraint);
mainLayout->setGeometry(QRect(0,0,400,200));
habe ich schon probiert
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Re: QGridLayout

Beitrag von padreigh »

vielleicht macht http://doc.qt.nokia.com/4.6/qwidget.htm ... ement-prop was du brauchst? Wenn du da 2:1 eingibst?
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag von marvin »

also um ehrlich zu sein müsste das fenster genau 480x272 groß sein :)

aber das scheint mit QGridlayout wohl nicht so hinzuhauen?!
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag von marvin »

hallo es ist noch ein problem dazu gekommen :(

ich wollte in der 4 spalte quasi noch einen calendar hinzufügen, aber der verzieht jetzt irgendwie die erste spalte :( ich habe mal ein bild hinzugefügt was dieses illustriert.
natürlich hab ich schon selbst versucht ansätze zu finden z.b. mit folgendem code

Code: Alles auswählen

	calendar = new QCalendarWidget;
	
        QGridLayout *mainLayout = new QGridLayout;
		QGridLayout *subLayout = new QGridLayout;

	    mainLayout->setSizeConstraint(QLayout::SetFixedSize);
	
        mainLayout->addWidget(display, 0, 0, 1, 6);
        mainLayout->addWidget(backspaceButton, 1, 0, 1, 2);
        mainLayout->addWidget(clearButton, 1, 2, 1, 2);
		
		mainLayout->addLayout(subLayout,0,6);
		subLayout->addWidget(calendar,0,0); // hier wird der kalender geaddet
wie kann ich den kalender quasi vom GRID entkoppeln sodass er wenigstens die vorherigen spalten nicht mehr beeinflusst
Dateianhänge
Unbenannt.JPG
Unbenannt.JPG (27.65 KiB) 6511 mal betrachtet
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Erstelle doch das Fenster im Qt-Designer und setz dort auch mal ein Gridlayout. Dann legst Du die Grösse fest.

Nun schaust Du in den Code, wie das gemacht werden muss.
Oder benutze direkt das ui-File.
Linux, das längste Text-Adventure aller Zeiten
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Ehrlich gesagt: ich verstehe den "mein Fenster MUSS 376.8 x 295.5 pixel groß sein" Ansatz nicht ...
edit: Unter dem Hintergrund embedded display --- dann schon ;)

Code: Alles auswählen

#include <QtGui>
#include <QtCore>


// eigener größen vergleich
bool operator>(QSize const& a, QSize const& b)
{
    return (a.height()>b.height() || a.width()>b.width());
}


int main(int argc, char *argv[])
{
    QApplication app(argc, argv); 

    QWidget * w = new QWidget;
    QGridLayout *l = new QGridLayout;

    QStringList z;
    int i=1;
    QFont font("Comic Sans MS",18);
    QFontMetrics fm(font);
    QSize size(0,0);

    // erstelle stringlist mit button-label's
    for(i=1;i < 10;++i)
    {
        QString tmp = QString::number(i);

        // ermittle "breiteste/höchste Zahl" und merk dir die size
        if (fm.size(Qt::TextSingleLine,tmp) > size)
        {
            size = fm.size(Qt::TextSingleLine,tmp);
        }
        z << tmp;
    }
    z << "+" << "0" << "-"; // {"1","2", ... , "9", "+", "0", "-" }

    i=0;
    // ermittle größte Dimension des größten Labels
    int quad = qMax(size.width(),size.height());

    // machn quadrat draus
    size = QSize(quad,quad);

    foreach ( QString label, z)
    {
         // mach n button
         QPushButton * pbut = new QPushButton(label);
         pbut->setMaximumSize(size);  // maximum größe
         pbut->setMinimumSize(size);   // minimum größe
         pbut->setObjectName(QString("button:"+label));   // zum connecten brauchst ne referenz oder nen namen oder oder 
         pbut->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); // mach das nicht größer als die minimum size, egal wieviel platz da ist

        l->addWidget(pbut,i/3,i%3); // packs in die i/3 zeile, i%3 spalte

        l->setColumnStretch(i%3,0); // das wird insgesamt 6x zu oft aufgerufen aber egal
        l->setRowStretch(i/3,0);  // und sorgt für nicht vergrößernde "zellen"
        ++i; // zähler hoch fürs placement
    }
 
    // mach n calc button
    QPushButton * pbut = new QPushButton("calc");
    // ermittle größe
    size = fm.size(Qt::TextSingleLine,pbut->text());
    pbut->setMinimumSize(size);  // soll mindestens so groß sein
    pbut->setObjectName(QString("button:"+pbut->text()));  // namen dran zum widerfinden 
    pbut->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);

   // adde den ganz unten ab column 0, soll 1 row hoch und so breit wie columnCount werden
    l->addWidget(pbut,l->rowCount()+1,0,1,l->columnCount() );
    // sorgt fürs stretchen ...wenn irgendeine Column/row gestretched wird, dann die rechts unter dem Rechnerfeld 
    l->setColumnStretch(l->columnCount()+1,99);
    l->setRowStretch(l->rowCount()+1,99);

    // größe des Layouts
    size = l->sizeHint();
    // widget nimmt das Layout
    w->setLayout(l);
    // widget darf nicht größer werden als das Layout
    w->setMinimumSize(size);
    w->setMaximumSize(size);
    // nimm den font
    w->setFont(font);
    w->show();
    return app.exec();
}
Wenn man seine User schon so gängel möchte das nichts geändert werden soll bietet Qt doch eine Menge Restriktionen...
Zuletzt geändert von padreigh am 16. August 2010 13:35, insgesamt 5-mal geändert.
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

marvin hat geschrieben:hallo es ist noch ein problem dazu gekommen :(

ich wollte in der 4 spalte quasi noch einen calendar hinzufügen, aber der verzieht jetzt irgendwie die erste spalte
Nimm nen Blatt Papier, mal dir alles auf ... wo die Buttons hinkommen, wo der Kalender hinkommt. Dann nimmste ne andere Farbe und malst Layouts drum rum die die Buttons gruppieren. Du kannst zB ein äusseres QHBoxLayout nehmen, da packst du ein QGridlayout rein und ein QDateTimeWidget ... dann sind die schonmal nebeneinander. Dann packst du in das QGridLayout die Taschenrechner-Sachen ...

Alternativ schau dir das QGridLayout::addWidget() mal an, da gibt es die Möglichkeit einem einzelnen Widget (dem Kalender)über mehrere Zellen zu verteilen (In deinem Fall alle vorhandenen Zeilen zB.)
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag von marvin »

Hallo padreigh, ich versteh deine eine Antwort leider nicht ganz:) der quellcode den du gepostet hast macht was genau?

Leider muss die App genau diese Größe haben weil sie irgendwann auf ein Embedded board kommt auf dem das Display genau diese Größe an Pixel hat.

den QT Creator kann ich leider nicht nutzen.

ich werde mir mal die add widget funktion anschauen.

gibts eig. auch ein widget in dem man Kalender UND Tageszeit drinen hat, quasi ein Terminplaner ? in QT3 gabs wohl mal QDataTime aber das soll man wohl nicht mehr nutzen wenn man QT4 Programmiert.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Warum setzt du dann nicht einfach die Widget/MainWindow/TopLevelFenster -größe mit setMaximumSize(480,272) ? Alle anderen Layoutelemente können dann QLayouts plazieren ... wenn die App zu groß wird, werden dann halt Slider eingeblendet.

Den Code oben hab ich bisschen kommentiert (Ergebnis s.Bild).
marvin hat geschrieben:gibts eig. auch ein widget in dem man Kalender UND Tageszeit drinen hat, quasi ein Terminplaner ?
Es gibt http://doc.trolltech.com/latest/qdatetimeedit.html als Eingabewidget bei dem man mittels void setCalendarPopup ( bool enable ) so ein QCalendarWidget zur Datumsselektion aufpoppen lassen kann. Die Uhrzeit kannst du in das dann zusätzlich "händisch" Eingeben
Dateianhänge
calc.jpg
calc.jpg (6.67 KiB) 6490 mal betrachtet
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
marvin
Beiträge: 29
Registriert: 23. Mai 2010 11:58

Beitrag von marvin »

oh vielen dank :) den Kalender hab ich jetzt "gespannt" über mehrere grideinheiten.

und habe jetzt auch geschafft die maximale größe auf die pixel festzusetzen, musste quasi nur den QDialog der in main.cpp erzeugt wird im konstrukter der klasse setzen, ich hatte das zuvor mal probiert. aber damals gab es einen fehler.

nochmals danke für die hilfe ich werde mal beginnen die ratschläge / hilfe umzusetzen.

gruß
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Es ist nix gut
*) statisch Pixelangaben für Größen zu setzen. Ein anderer QStyle, andere Fonteinstellungen, etc... und dein Programm wird unbenutzbar!
*) QGridLayout so zu misbrauchen. Du sollst da ein anderes Layout drumrumsetzen!

Hier einfach, wie ich es gemacht hätte:

Code: Alles auswählen

#include <QApplication>
#include <QHBoxLayout>
#include <QToolButton>
#include <QGridLayout>
#include <QCalendarWidget>

int main(int argc, char** argv) {
    QApplication app(argc, argv);
    QWidget w;

// hl ist das Mainlayout
    QHBoxLayout* hl = new QHBoxLayout(&w);
    QGridLayout* gl = new QGridLayout;

// das GridLayout legen wir ins andere Layout    
    hl->addLayout(gl);
// und den Kalender daneben
    hl->addWidget(new QCalendarWidget);
    
    for( int x=0; x<3; x++ ) {
        for( int y=0; y<3; y++ ) {
            QToolButton* btn = new QToolButton;
            btn->setText(QString::number(y*3+x+1));
            gl->addWidget(btn,y,x);
        }
    }

// setze Constraint auf FixedSize -> man kann das Fenster nicht mehr vergrößern.    
    hl->setSizeConstraint(QLayout::SetFixedSize);
    
    w.show();
    return app.exec();
}
Antworten