隔了几天阴冷,今天下午闪了一丝阳光。
上次我们学习了如何构造一个简单的小例子,既然QT是C++ based,因此需要知晓如何创建一个对象以及实现对象的继承,同时我们对Layout中的QGridLayout进行学习。
在上次的例子中,我们知道如果创建一个不带parent的QWidget,那么这个widget就视为一个window。现在,我们创建这样一个windows的类,将这个window作为panel在上面摆放各种组件,因此该类继承QWidget。这个类名称为Addressbook,因此创建两个文件addressbook.cpp,addressbook.h,以及主函数所在qtmain.cpp。
相关参考:http://doc.qt.nokia.com/latest/tutorials-addressbook-part1.html
在这个Addressbook的windows上,我们采用GuidLayout的方式来排放,下图是最后的执行结果,左图是在Handset模拟器运行,右图在ubuntu上的运行,并加上了组件摆放位置。
一、写*.pro文件
#和以前的例子像比较,增加了TARGET缺省为*.pro文件的名字,如果不同,需要重新定义,并且将所需编译的头文件和源代码文件补充如SOURCES和HEADERS两个参数
TARGET = local-test2
SOURCES = qtmain.cpp addressbook.cpp
HEADERS = addressbook.hVPATH = src
OBJECTS_DIR = build
DESTDIR = build
二、对象的头文件:addressbook.h
/* addressbook.h - 定义AddressBook类,作为QWidget的一个继承子类,并定义一个constructor。 */
#ifndef COM_WEI_ADDRESSBOOK_H
#define COM_WEI_ADDRESSBOOK_H#include <QWidget>
/* 由于我们在AddressBook中使用了QLineEdit和QTextEdit两个类,不在QWidget的定义范围,因此为了保证编译通过,需要在此处定义(感觉有些像C里面的extern定义),否则在编译的时候会报告:的在ISO C++ forbids declaration of ‘QLineEdit’ with no type 。如果#include <QtGui>,不加这个两个也可以,但是会生成一个moc_addressbook.cpp的文件。*/
class QLineEdit;
class QTextEdit;class AddressBook : public QWidget //注意继承的书写方式
{
/* 我们使用Q_OBECT宏定义来表明该类使用QT很多优秀的特性,包括signal和slots等等。即使我们不使用这些特性和功能,仍建议进行定义。在当前我们肤浅的学习,可以简单地认为Q_OBJECT宏定义是允许我们使用QT的tr()和connect()函数的shortcut.*/
Q_OBJECTpublic:
AddressBook(QWidget * parent = NULL);private:
QLineEdit * nameLine;
QTextEdit * addressText;
};#endif
三、对象源文件:addressbook.cpp
/* addressbook.cpp - the implementation file for the AddressBook class */
#include <QtGui>
#include "addressbook.h"AddressBook :: AddressBook(QWidget * parent) :QWidget(parent) //集成构造函数,并注意继承的书写格式。
{
QLabel * nameLabel = new QLabel(tr("Name:"));
nameLine = new QLineEdit;QLabel * addressLabel = new QLabel(tr("Address:"));
addressText = new QTextEdit;//这里介绍了采用GridLayout的排版方式,见上面右图,将panel分割为(x,y)的二维空间,在每个位置采用addWidget进行排版。另外如果没有参数,我们看到new QGridLayout()也可以写成 new QGridLayout。
QGridLayout * mainLayout = new QGridLayout;
mainLayout->addWidget(nameLabel,0,0);
mainLayout->addWidget(nameLine,0,1);
mainLayout->addWidget(addressLabel,1,0,Qt::AlignTop);
mainLayout->addWidget(addressText,1,1);setLayout(mainLayout); //由于是QWidget的继承,可以直接使用setLayout
setWindowTitle(tr("Simple Address Book")); //这里使用了tr(),也就是Q_OBJECT,这个translate的使用方式还不太晓得,可以作为编码格式的转换。
}
四、主文件main()
/* qtmain.cpp - the file containing a main() function, with an instance of AddressBook. */
#include <QtGui>
#include "addressbook.h"int main(int argc, char * argv[])
{
QApplication app(argc,argv);AddressBook addressBook;
addressBook.show();return app.exec();
}
相关链接:我的MeeGo/Moblin相关文章