Verständnisproblem mit QGridLayout

Alles rund um die Programmierung mit Qt
Antworten
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Verständnisproblem mit QGridLayout

Beitrag von M@g!ndo$ch »

Hallo,

ich hab ein Verständnisproblem mit QGridLayout....

Ich bin QT-Anfänger und wollte eifach mal ein bisschen rumprobieren.

Ich wollte meinem MainWindow zwei QTextEdits zufügen, wobei das erste doppelt so hoch sein soll wie das andere. Ich habe versucht dies mit dem QGridLayout hinzubekommen, bin aber gescheitert. Ich versteh aber absolut nicht was ich falsch mache.

Ich habe eine Klasse MainWindow erzeugt, welche von QMainWindow erbt.

Hier der Code:

Code: Alles auswählen

#include "MainWindow.h"
MainWindow::MainWindow(QWidget* parent /* = 0 */, Qt::WindowFlags flags /* = 0 */)
: QMainWindow(parent, flags)
{
	initialise();
	initSignalsAndSlots();
}
MainWindow::~MainWindow()
{
}

void MainWindow::initialise()
{
	this->setObjectName("MainWindow");
	this->setWindowTitle("MainWindow v1.0");
	this->setFixedSize(800,600);

	//init central widget
	m_pCentralWidget = new QWidget(this);
	m_pCentralWidget->setObjectName("CentralWidget");
	this->setCentralWidget(m_pCentralWidget);

	//init statusbar
	m_pStatusbar = new QStatusBar(this);
	m_pStatusbar->setObjectName("Statusbar");
	this->setStatusBar(m_pStatusbar);
	m_pStatusbar->showMessage("Ready");

	//init Layout
	m_pMainLayout = new QGridLayout();
	
	QTextEdit *edit1 = new QTextEdit();
	edit1->setPlainText("edit1");
	QTextEdit *edit2 = new QTextEdit();
	edit2->setPlainText("edit2");
	m_pMainLayout->addWidget(edit1,0,0,2,1,0);
	m_pMainLayout->addWidget(edit2,2,0,1,1,0);
	m_pCentralWidget->setLayout(m_pMainLayout);

	//init menubar
	m_pMenuBar = new QMenuBar();
	m_pMenuBar->setObjectName("MenuBar");
	m_pFileMenu = new QMenu(tr("&File"),m_pMenuBar);
	m_pFileMenu->setObjectName("FileMenu");
	m_pHelpMenu = new QMenu(tr("&Help"),m_pMenuBar);
	m_pHelpMenu->setObjectName("HelpMenu");
	m_pMenuBar->addMenu(m_pFileMenu);
	m_pMenuBar->addMenu(m_pHelpMenu);
	//init Actions
	m_pActionExit = m_pFileMenu->addAction(tr("E&xit"));
	m_pActionExit->setObjectName("ActionExit");
	m_pActionAbout = m_pHelpMenu->addAction(tr("&About"));
	m_pActionAbout->setObjectName("ActionAbout");
	this->setMenuBar(m_pMenuBar);
}

void MainWindow::initSignalsAndSlots()
{
	QObject::connect(m_pActionExit, SIGNAL(triggered()), this, SLOT(close()));
}
Hiermit wollte ich erzwingen, dass edit1 doppelt so hoch ist wie edit2:

Code: Alles auswählen

QTextEdit *edit1 = new QTextEdit();
	edit1->setPlainText("edit1");
	QTextEdit *edit2 = new QTextEdit();
	edit2->setPlainText("edit2");
	m_pMainLayout->addWidget(edit1,0,0,2,1,0);
	m_pMainLayout->addWidget(edit2,2,0,1,1,0);
	m_pCentralWidget->setLayout(m_pMainLayout);
Doch wenn ich das Progrämmchen laufen lasse ist edit2 doppelt so hoch wie edit1!!! Das kann ich mir absolut nicht erklären :-(

Wenn ich die Qt-Dokumentation richtig vertanden habe, müsste doch alles passen:
void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )

Kann mir bitte jemand helfen?!? Ich versteh die Welt nicht mehr.....

Gruß M@g
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Hi :)

QLineEdit ist ein QWidget (es erbt ja davon). QWidget hat nun eine Methode setGeometry(). Schau dir im assistant diese mal an (gibt 2 davon).

Grüße
Franz
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Beitrag von M@g!ndo$ch »

Thx für die schnelle Antwort!!!

Du meinst ich soll's einfach ohne Layout machen und dann die Ausmaße der TextEdits "von Hand" festlegen?
Das würde vermutlich schon gehen, ich möchte aber trotzdem wissen was ich da falsch verstanden habe !!!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ohne Layout ist Käse... Du suchst:

Code: Alles auswählen

void QGridLayout::setColumnStretch ( int column, int stretch )
bzw.

Code: Alles auswählen

void QGridLayout::setRowStretch ( int row, int stretch )
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Beitrag von M@g!ndo$ch »

Vielen Dank,
so funtionierts jetzt....

Code: Alles auswählen

QTextEdit *edit1 = new QTextEdit();
edit1->setPlainText("edit1");
QTextEdit *edit2 = new QTextEdit();
edit2->setPlainText("edit2");
m_pMainLayout->addWidget(edit1,0,0);
m_pMainLayout->setRowStretch(0,2);
m_pMainLayout->addWidget(edit2,2,0);
m_pCentralWidget->setLayout(m_pMainLayout);
Aber kann mir jemand erklären warum es nicht so funktioniert hat, wie ich es am Anfang versucht habe?

Mit m_pMainLayout->addWidget(edit1,0,0,2,1,0); wollte ich folgendes erreichen -> platziere edit1 im Grid an Position 0,0. edit1 soll sich über 2 Zeilen und eine Spalte erstrecken.
Und dann m_pMainLayout->addWidget(edit2,2,0,1,1,0); -> platziere edit2 an Position 2,0. edit2 soll sich über 1 Zeile und 1 Spalte erstrecken.

Klingt doch logisch oder hab ich da was komplett falsch verstanden???

Sry, dass ich so hartnäckig bin, aber ich würd' eben gern verstehen was ich falsch gemacht habe !!!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Weil du von einer festen Zellengröße ausgehst, nur die Größe von 2 Zellen ist nun nicht mal 2x die Größe von einer Zelle (eben deswegen der Parameter stretch).
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Beitrag von M@g!ndo$ch »

Achso. Thx.

Ich dachte eben, dass das Layout den zur Verfügung stehenden Platz des Parent-Widgets verwaltet. Also, dass ich nur definieren muss, wieviele Spalten und Zeilen es gibt und wie dir Widgets, die dem Layout zugefügt werden, diese Zellen belegen.

Bin bei meinem Beispiel davon ausgegangen, dass ich 3 Zeilen hab, von denen edit1 zwei und edit2 eben nur eine Zeile "belegt".

Ich finde, das lässt auch die Qt-Doku vermuten:
void addWidget ( QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )

Naja, dann hab ich das eben falsch interpretiert.... :?

Thx, für die Hilfe :!: :!: :!:
Antworten