A QT widget csomagoló rendszerének használata

Rólam
   Főoldal
   Önéletrajzom
   Képek

Tanulmányok és Oktatás
   EAF1
   EAF3
   EAF4
   Fontkészlet
   PNY1
   PP
   ProgKör
   Visual Basic

Érdeklődési körök
   Linux
   Linux PalmLD
   RDiff

Munkák
   Önéletrajz
   CV in English




utolsó módosítás:
2010. augusztus 9.

(C) 2005 Zimler Attila Tamás <hijaszu@hlfslinux.hu>

Bevezetés

A QT widgeteit lehetőségünk van úgy elhelyezni, hogy automatikusan a lehető legjobb méreteket vegyék fel, amennyiben az ablakot átméretezzük. Ugyanakkor a QMainWindow osztály objektumaiba az egyedi elhelyező rendszer miatt nehézkes ennek használata. Ez az oldal ennek a két problémának a megoldását fogja demonstrálni.

A példaprogram teljes forráskódja itt található: packaging.cpp.

Fordítás

Amennyiben a példaprogramot a /tmp könyvtárba mentjük le, akkor a fordítását és a futtatását a következő parancsokkal tudjuk megvalósítani:

	cd /tmp
	qmake -project
	qmake
	make
	./tmp

A látvány

A programot elindítva a következő képernyőt látjuk:

packaging-1.png
Az ablak alapállapotban

Figyeljük meg, hogy az ablakot megnyújtva a gombok is a megfelelő méretűre nyúlnak:

packaging-2.png
Az ablak megnyújtott állapotban

Megjegyzés: Azért a QT widget csomagoló rendszere nem teljesen tökéletes, mert a gombot illene függőleges irányban is megfelelően nyújtani, amit nem tesz meg.

A kód elemzése

Az ablak osztályának definíciója.

class Packaging : public QMainWindow {
	QWidget			*cw;		// A QMainWindow leendő központi widgete
	QVBoxLayout		*vbox;		// Függőleges elhelyezés
	
	QHBoxLayout		*line1, *line2;		// A gombok sorai (első és második)
	QPushButton		*btn1, *btn2, *btn3, *btn4;		// A gombok

public:
	Packaging();
	~Packaging();
};

Ebben nincsen semmi különös, definiálunk egy osztályt konstruktorral és destruktorral.

A konstruktor:

Packaging::Packaging()
{
	setCentralWidget(cw = new QWidget(this));
	vbox = new QVBoxLayout(cw);

	line1 = new QHBoxLayout;
	line2 = new QHBoxLayout;
	
	vbox->addLayout(line1); vbox->addLayout(line2);
	
	btn1 = new QPushButton("1", cw);
	btn2 = new QPushButton("2", cw);
	btn3 = new QPushButton("3", cw);
	btn4 = new QPushButton("4", cw);
	
	line1->addWidget(btn1);
	line2->addWidget(btn2); line2->addWidget(btn3); line2->addWidget(btn4);
}

Ahhoz, hogy az első QVBoxLayout vagy QHBoxLayout objektumot a QMainWindow objektumra tudjuk helyezni egy kicsit trükközni kell a QMainWindow saját elrendezője miatt. Ezt a konstruktor első két sorával lehet megvalósítani. Fontos, hogy az első sorban létrehozott QWidget objektum címét eltároljuk (túl azon, hogy a második sorban szükség lesz rá), mert ez az egyetlen olyan widget objektum, amelyet nem fog felszabadítani a QMainWindow osztály destruktora. Amennyiben ezt az objektumot nem szabadítjuk fel a saját destruktorunkban, akkor a programunk memória szivárogni fog.

A destruktor:

Packaging::~Packaging()
{
	delete cw;
}

Az egyetlen widgetet felszabadítjuk, amelyet fel kell. Amennyiben például a btn1 pointer által mutatott widgetet is megpróbálnánk felszabadítani a destruktorban, akkor a QT egy szép figyelmeztetést ír a hibakimenetre, hogy illegális objektumot próbálunk felszabadítani.

A főprogram:

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	Packaging pkg;
	app.setMainWidget(&pkg);
	pkg.show();
	return app.exec();
}

A főprogramban semmi extra nincsen, létrehozunk egy alkalmazást, létrehozzuk az ablakot, beállítjuk, hogy az a fő objektum és elindítjuk az alkalmazást.