QGridLayout
QGridLayout
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
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
Re: QGridLayout
vielleicht macht http://doc.qt.nokia.com/4.6/qwidget.htm ... ement-prop was du brauchst? Wenn du da 2:1 eingibst?
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
wie kann ich den kalender quasi vom GRID entkoppeln sodass er wenigstens die vorherigen spalten nicht mehr beeinflusst
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
- Dateianhänge
-
- Unbenannt.JPG (27.65 KiB) 6511 mal betrachtet
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
Wenn man seine User schon so gängel möchte das nichts geändert werden soll bietet Qt doch eine Menge Restriktionen...
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();
}
Zuletzt geändert von padreigh am 16. August 2010 13:35, insgesamt 5-mal geändert.
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 ...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
Alternativ schau dir das QGridLayout::addWidget() mal an, da gibt es die Möglichkeit einem einzelnen Widget (dem Kalender)über mehrere Zellen zu verteilen n deinem Fall alle vorhandenen Zeilen zB.)
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.
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.
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).
Den Code oben hab ich bisschen kommentiert (Ergebnis s.Bild).
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" Eingebenmarvin hat geschrieben:gibts eig. auch ein widget in dem man Kalender UND Tageszeit drinen hat, quasi ein Terminplaner ?
- Dateianhänge
-
- calc.jpg (6.67 KiB) 6490 mal betrachtet
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ß
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ß
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:
*) 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();
}