Seite 1 von 1

QWidgets fuer Layouts?

Verfasst: 14. April 2008 08:25
von C167
Tagchen,
ich bastle (mal wieder) an einer kleinen Oberflaeche.

http://valouch.info/screen/cdl/binview_form.png

Im Designer und seiner Vorschau (Screenshot links oben und unten) funktioniert das alles. Rechts ist die Objekthierarchie. Nun hab ich das was ich da von uic bekommen hab in eine Klasse geballert. Nuuuun hat der neue uic, der mit Qt 4.4 rc1 gekommen ist, einfach nur die Methode addLayout genommen, anstelle wie bisher ein Widget anzulegen, ein Layout anzulegen, dem widget das Layout zu verpassen und ganz am schluss das Widget zum Parent-Layout hinzugefuegt.

Ergebnis sieht man oben rechts im Screenshot. Das ganze ist direkt ganz oben links in den linken Rand geschoben. Der Code der Klasse:

Code: Alles auswählen

//header
class BinaryViewer : public QWidget
{
		Q_OBJECT
	public:
		BinaryViewer ( QString, QString, QWidget *parent = 0 );
		~BinaryViewer();

	private:
		void createUi();
// 		void createRootNodes();
// 		void createTree ( );

		// Layout
		QVBoxLayout *mainLayout;

		QTreeWidget *treeWidget;

		QTabWidget *tabWidget;
		QVBoxLayout *baseLayout1;
		QHBoxLayout *horizontalLayout;
		QLabel *pic1;
		QLabel *pic2;
		QVBoxLayout *verticalLayout;
		QLabel *pictureLabel;
		QTextEdit *description;
		QTextEdit *extendedDescription;

		// the tree view
		QString m_table, m_name;
};

// source
void BinaryViewer::createUi()
{
	// main layout
	mainLayout = new QVBoxLayout ( this );
	setLayout ( mainLayout );

	// tree widget
	treeWidget = new QTreeWidget ( this );
	treeWidget->setObjectName ( QString::fromUtf8 ( "treeWidget" ) );
	treeWidget->setStyleSheet ( "max-width: 150px" );
	mainLayout->addWidget ( treeWidget );

	baseLayout1 = new QVBoxLayout ( );
	baseLayout1->setObjectName ( QString::fromUtf8 ( "verticalLayout_2" ) );

	horizontalLayout = new QHBoxLayout ( );
	horizontalLayout->setObjectName ( QString::fromUtf8 ( "horizontalLayout" ) );

	// tab widget
	tabWidget = new QTabWidget ( this);
	tabWidget->setObjectName ( QString::fromUtf8 ( "tabWidget" ) );
	tabWidget->setStyleSheet ( QString::fromUtf8 ( "" ) );
	tabWidget->setTabPosition ( QTabWidget::South );

	// tab 1
	pic1 = new QLabel ( this );
	pic1->setObjectName ( QString::fromUtf8 ( "tab1" ) );
	pic1->setGeometry ( QRect ( 0, 0, 115, 179 ) );
	tabWidget->addTab ( pic1, QString ( "Bild 1" ) );

	// tab 2
	pic2 = new QLabel ( this );
	pic2->setObjectName ( QString::fromUtf8 ( "tab2" ) );
	pic2->setGeometry ( QRect ( 0, 0, 399, 292 ) );
	tabWidget->addTab ( pic2, QString ( "Bild 2" ) );

	horizontalLayout->addWidget ( tabWidget );

	verticalLayout = new QVBoxLayout();
	verticalLayout->setObjectName ( QString::fromUtf8 ( "verticalLayout" ) );
	pictureLabel = new QLabel ( this );
	pictureLabel->setObjectName ( QString::fromUtf8 ( "pictureLabel" ) );
	pictureLabel->setStyleSheet ( QString::fromUtf8 ( "border: 1px solid black;" ) );
	verticalLayout->addWidget ( pictureLabel );

	description = new QTextEdit ( this );
	description->setObjectName ( QString::fromUtf8 ( "description" ) );
	verticalLayout->addWidget ( description );

	horizontalLayout->addLayout ( verticalLayout );
	baseLayout1->addLayout ( horizontalLayout );

	// extended description
	extendedDescription = new QTextEdit ( this );
	extendedDescription->setObjectName ( QString::fromUtf8 ( "extendedDescription" ) );
	baseLayout1->addWidget ( extendedDescription );

// 	horizontalLayout->addLayout ( baseLayout1 );
}
Lustich ist auch, dass ich, wenn ich die letzte Zeile entkommentiere, einen Segfault bekomme.

Generell aber die Frage, sollte man fuer jedes Layout ein Widget anlegen? Da ich das bisher so gemacht hab, ist die Erstellung der Oberflaeche ein wenig... sagen wir unuebersichtlich, vor allem die Vergabe von Namen ist in den meisten Faellen ein wenig schwierig.
C167

Verfasst: 16. April 2008 13:20
von solarix
Lustich ist auch, dass ich, wenn ich die letzte Zeile entkommentiere, einen Segfault bekomme.
Ein Segfault wuerde ich zwar auch nicht erwarten, aber was genau erwartest du denn von

Code: Alles auswählen

baseLayout1->addLayout ( horizontalLayout ); 
[...]
horizontalLayout->addLayout ( baseLayout1 ); 
Zuerst bettest du "horizontalLayout" in "baseLayout1" und danach umgekehrt?
Nun hab ich das was ich da von uic bekommen hab in eine Klasse geballert.
Verstehe ich dich richtig, dass du zuerst die ui mittels uic in eine Header uebersetzt und danach den Code von Hand in deine Klasse kopierst?!?