QTGUI www gecedu org www gecedu org GUI

  • Slides: 126
Download presentation
基于QT的GUI程序设计 www. gec-edu. org

基于QT的GUI程序设计 www. gec-edu. org

www. gec-edu. org GUI发展

www. gec-edu. org GUI发展

www. gec-edu. org GUI发展 v Mac OS System 7 (released in 1991) Mac OS

www. gec-edu. org GUI发展 v Mac OS System 7 (released in 1991) Mac OS 7 是第一款支持彩色的 GUI,图标中加入了微妙的灰,蓝,黄阴影。

www. gec-edu. org 现代GUI

www. gec-edu. org 现代GUI

www. gec-edu. org Linux下的桌面GUI KDE gnome

www. gec-edu. org Linux下的桌面GUI KDE gnome

www. gec-edu. org Linux下的桌面GUI v Qt是整个KDE的基础 v GNOME与KDE交替发展

www. gec-edu. org Linux下的桌面GUI v Qt是整个KDE的基础 v GNOME与KDE交替发展

www. gec-edu. org Linux下的桌面GUI KDE gnome

www. gec-edu. org Linux下的桌面GUI KDE gnome

www. gec-edu. org 嵌入式GUI v 目前在嵌入式系统比较流行的图形用户界面GUI : § Qt/Embedded § Micro. Windows § Mini.

www. gec-edu. org 嵌入式GUI v 目前在嵌入式系统比较流行的图形用户界面GUI : § Qt/Embedded § Micro. Windows § Mini. GUI

www. gec-edu. org 嵌入式GUI 下图所示比较了Qt/Embedded与Qt/X 11的架构区别。

www. gec-edu. org 嵌入式GUI 下图所示比较了Qt/Embedded与Qt/X 11的架构区别。

www. gec-edu. org 嵌入式GUI

www. gec-edu. org 嵌入式GUI

www. gec-edu. org 嵌入式GUI v Mini. GUI的层次结构如下所示: v

www. gec-edu. org 嵌入式GUI v Mini. GUI的层次结构如下所示: v

www. gec-edu. org 嵌入式GUI QT Mini. GUI Microwindows

www. gec-edu. org 嵌入式GUI QT Mini. GUI Microwindows

www. gec-edu. org QT快速入门

www. gec-edu. org QT快速入门

www. gec-edu. org 创建第一个QT程序 v v 打开一个终端,建立一个文件夹,如:mkdir hello 然后进入这个文件夹:cd hello 创建c++文件,vi hello. cpp 在文件中键入下面的代码:

www. gec-edu. org 创建第一个QT程序 v v 打开一个终端,建立一个文件夹,如:mkdir hello 然后进入这个文件夹:cd hello 创建c++文件,vi hello. cpp 在文件中键入下面的代码: v #include <qapplication. h> v #include <qpushbutton. h > v v v v int main(int argc, char *argv[]) { QApplication app(argc, argv); QPush. Button *hello=new QPush. Button("Hello World!", 0); app. set. Main. Widget(hello); hello->show(); return app. exec(); }

www. gec-edu. org Designer快速创建Qt 程 v 如下是Qt Designer主窗口,确保Property Editor可 见。如果不可见的,用户可以通过 Windows→Views→Property Editor/Signal Handlers选单选项来使其可见.

www. gec-edu. org Designer快速创建Qt 程 v 如下是Qt Designer主窗口,确保Property Editor可 见。如果不可见的,用户可以通过 Windows→Views→Property Editor/Signal Handlers选单选项来使其可见.

www. gec-edu. org Designer快速创建Qt 程

www. gec-edu. org Designer快速创建Qt 程

www. gec-edu. org Designer生成文件分析 v Hello. pro文件分析 v TEMPLATE = app #QT模板为app v LANGUAGE

www. gec-edu. org Designer生成文件分析 v Hello. pro文件分析 v TEMPLATE = app #QT模板为app v LANGUAGE = C++ # 程文件路径为当前目录 v v v v CONFIG += qt warn_on release #CONFIG的配置模块, 一般采用默认即可 # QT运行系统环境设置 unix { # Unix系统环境则执行以下内容 UI_DIR =. ui # Ui文件的存放目录 MOC_DIR =. moc # Moc文件的存放目录 OBJECTS_DIR =. obj # 程目标. o文件的存放目录 } v SOURCES += main. cpp # 程文件源码包含main. cpp v FORMS = form 1. ui # 程UI文件包含form 1. ui

www. gec-edu. org Designer生成文件分析 v 通过uic 具自动转译成的form 1. h头文件内容如下: v v v v #ifndef

www. gec-edu. org Designer生成文件分析 v 通过uic 具自动转译成的form 1. h头文件内容如下: v v v v #ifndef FORM 1_H //文件标识宏 #define FORM 1_H //包含QT相关头文件 #include <qvariant. h> #include <qdialog. h> //被引用的类体的前置声明 class QVBox. Layout; class QHBox. Layout; class QGrid. Layout; class QSpacer. Item; class QPush. Button; // 类Form 1 的原型声明,从QDialog父类公有继承 class Form 1 : public QDialog { Q_OBJECT //声明Q_OBJECT 宏,支持信号槽机制

www. gec-edu. org Designer生成文件分析 v v //公有成员方法 public: //构造函数 Form 1( QWidget* parent =

www. gec-edu. org Designer生成文件分析 v v //公有成员方法 public: //构造函数 Form 1( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); v v v v v //析构函数 ~Form 1(); //定义一个QPush. Button类型的按钮对象 QPush. Button* push. Button 1; protected: protected slots: // 受保护的槽函数 virtual void language. Change(); //用于显示文本信息的虚函数,实现多态继承 }; #endif // FORM 1_H //文件标识宏

www. gec-edu. org Designer生成文件分析 v v v v Form 1. cpp文件内容如下: #include "form 1.

www. gec-edu. org Designer生成文件分析 v v v v Form 1. cpp文件内容如下: #include "form 1. h" //包含类form 1的原型声明的头文件 //包含各引用类的原型声明的头文件 #include <qvariant. h> #include <qpushbutton. h> #include <qlayout. h> #include <qtooltip. h> #include <qwhatsthis. h> #include <qimage. h> #include <qpixmap. h> //Form 1的构造函数 Form 1: : Form 1( QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) { if ( !name ) //如若窗口未定义名称 set. Name( "Form 1" ); //设置默认窗体名称为“Form 1”

www. gec-edu. org Designer生成文件分析 v v v v v push. Button 1 = new

www. gec-edu. org Designer生成文件分析 v v v v v push. Button 1 = new QPush. Button( this, "push. Button 1" ); //实例化一个新的按钮 push. Button 1 ->set. Geometry( QRect( 70, 60, 211, 61 ) ); //设置该按钮的位置属性 language. Change(); //显示控件上的文本信息 resize( QSize(354, 199). expanded. To(minimum. Size. Hint()) ); //设置窗口显示属性,从 QSize(354, 199) 和 minimum. Size. Hint()(返 回一个 QSize对象)中取两者之中的最大宽度和最大高度组成一个新的 QSize 对象。 clear. WState( WState_Polished ); //常见于用 Designer 生成的代码中。由于 WState_Polished 是一个内部标 志,在用户的代码中一般不要使用它。 } Form 1: : ~Form 1() //析构函数 { // no need to delete child widgets, Qt does it all for us } void Form 1: : language. Change() //显示空间文本信息 { set. Caption( tr( "Form 1" ) ); push. Button 1 ->set. Text( tr( "Hello World" ) ); //在按键上显示Hello World }

www. gec-edu. org 信号和槽的声明 v 信号与槽的声明也是在头文件中进行的。 v 例如,下面声明了三个信号: v signals: void mysignals(); void mysignals(int

www. gec-edu. org 信号和槽的声明 v 信号与槽的声明也是在头文件中进行的。 v 例如,下面声明了三个信号: v signals: void mysignals(); void mysignals(int x,int y); v 例如,下面声明了三个槽: v public slots: v void my. Slot(); void my. Slot(int x); void my. Signal. Param(int x, int y);

www. gec-edu. org Signal和Slot的声明(一) 在Qt程序设计中,凡是包含signal和slot的类中都要加 上Q_OBJECT的定义,下面的例子给出了如何在一个类 中定义signal和slot: class Student : public QObject { Q_OBJECT

www. gec-edu. org Signal和Slot的声明(一) 在Qt程序设计中,凡是包含signal和slot的类中都要加 上Q_OBJECT的定义,下面的例子给出了如何在一个类 中定义signal和slot: class Student : public QObject { Q_OBJECT public: Student() { my. Mark = 0; } int mark() const { return my. Mark; } public slots: void set. Mark(int new. Mark); signals: void mark. Changed(int new. Mark); private: int my. Mark; };

www. gec-edu. org Signal和Slot的声明(二) signal的发出一般在事件的处理函数中,利 用emit发出signal,在下面的例子中在在事件 处理结束后发出signal void Student: : set. Mark(int new. Mark)

www. gec-edu. org Signal和Slot的声明(二) signal的发出一般在事件的处理函数中,利 用emit发出signal,在下面的例子中在在事件 处理结束后发出signal void Student: : set. Mark(int new. Mark) { if (new. Mark!= my. Mark) { my. Mark = new. Mark; emit mark. Changed(my. Mark); } }

www. gec-edu. org Signal和Slot的连接(一) 在signal和slot声明以后,需要使用 connect()函数将它们连接起来。connect() 函数属于QObject类的成员函数,它能够连接 signal和slot,也可以用来连接signal和 signal 函数原形如下: bool QObject: : connect(const

www. gec-edu. org Signal和Slot的连接(一) 在signal和slot声明以后,需要使用 connect()函数将它们连接起来。connect() 函数属于QObject类的成员函数,它能够连接 signal和slot,也可以用来连接signal和 signal 函数原形如下: bool QObject: : connect(const QObject*, const char*, const QObject*, const char*, Qt: : Connection. Type) 其中第一个和第三个参数分别指出signal和 slot是属于那个对象或组件

www. gec-edu. org Signal和Slot的连接(二) 在使用connect()函数进行来接的时候,还 需要用到SIGNAL()和SLOT()这两个宏,使用 方法如下: QLabel *label = new QLabel; QScroll. Bar

www. gec-edu. org Signal和Slot的连接(二) 在使用connect()函数进行来接的时候,还 需要用到SIGNAL()和SLOT()这两个宏,使用 方法如下: QLabel *label = new QLabel; QScroll. Bar *scroll = new QScroll. Bar; QObject: : connect( scroll, SIGNAL(value. Changed(int)), label, SLOT(set. Num(int)) );

www. gec-edu. org Signal和Slot的连接方式(一)

www. gec-edu. org Signal和Slot的连接方式(一)

www. gec-edu. org Signal和Slot的连接方式(二) v 同一个信号连接多个插槽 connect(slider, SIGNAL(value. Changed(int)), spin. Box, SLOT(set. Value(int))); connect(slider,

www. gec-edu. org Signal和Slot的连接方式(二) v 同一个信号连接多个插槽 connect(slider, SIGNAL(value. Changed(int)), spin. Box, SLOT(set. Value(int))); connect(slider, SIGNAL(value. Changed(int)), this, SLOT(update. Status. Bar. Indicator(int))); v 多个信号连接到同一个插槽 connect(lcd, SIGNAL(overflow()), this, SLOT(handle. Math. Error())); connect(calculator, SIGNAL(division. By. Zero()), this, SLOT(handle. Math. Error()));

www. gec-edu. org Signal和Slot的连接方式(三) v 一个信号连接到另一个信号 connect(line. Edit, SIGNAL(text. Changed(const QString &)), this, SIGNAL(update.

www. gec-edu. org Signal和Slot的连接方式(三) v 一个信号连接到另一个信号 connect(line. Edit, SIGNAL(text. Changed(const QString &)), this, SIGNAL(update. Record(const QString &))); v 取消一个连接 disconnect(lcd, SIGNAL(overflow()), this, SLOT(handle. Math. Error())); v 取消一个连接不是很常用,因为Qt会在一个对象 被删除后自动取消这个对象所包含的所有的连接

www. gec-edu. org 创建带信号与槽的QT程序 v 打开一个终端,用vi建立一个文件slot. cpp 键入如下程序: v #include <qapplication. h> v #include

www. gec-edu. org 创建带信号与槽的QT程序 v 打开一个终端,用vi建立一个文件slot. cpp 键入如下程序: v #include <qapplication. h> v #include <qpushbutton. h> v v v int main( int argc, char **argv ) { QApplication a( argc, argv ); //创建QApplication对象 QPush. Button quit( "Quit", 0 ); //添加一个按扭, 因为这个按钮是一个顶层窗口,我们把0作为它的父对象 quit. resize( 75, 30 ); //设置按扭尺寸 QObject: : connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) ); // quit按扭的clicked信号与QApplication对象的quit()槽连接 a. set. Main. Widget( &quit ); //设置a为这个应用程序的主窗口部件 quit. show(); //显示quti按扭 return a. exec(); }

www. gec-edu. org 使用Designer创建信号与槽 v 效果图:

www. gec-edu. org 使用Designer创建信号与槽 v 效果图:

www. gec-edu. org 使用Designer创建信号与槽

www. gec-edu. org 使用Designer创建信号与槽

www. gec-edu. org Qt Designer中槽应用实例 void Main. Form: : add() { QString str 1,

www. gec-edu. org Qt Designer中槽应用实例 void Main. Form: : add() { QString str 1, str 2, str. Result; double add 1=0. 0, add 2=0. 0, result=0. 0; str 1=line. Edit 1 ->text(); str 2=line. Edit 2 ->text(); bool ok 1=FALSE, ok 2=FALSE; add 1=str 1. to. Double(&ok 1); add 2=str 2. to. Double(&ok 2); if(ok 1&&ok 2) { result=add 1+add 2; str. Result. sprintf("%f", result); text. Label. Result->set. Text(str. Result); } }

www. gec-edu. org QObject类(一) class Mandelbrot: public QObject { Q_OBJECT //需要使用signal和slot public : Mandelbrot(QObect

www. gec-edu. org QObject类(一) class Mandelbrot: public QObject { Q_OBJECT //需要使用signal和slot public : Mandelbrot(QObect *parent=0, const char *name); …… public slots: void start(); signals: void done(); private slots: void calculate(); private: QTimer timer; …… };

www. gec-edu. org 函数分组 系统设置 desktop. Settings. Aware()、set. Desktop. Settings. Aware()、cursor. Flash. Time()、set. Cursor.

www. gec-edu. org 函数分组 系统设置 desktop. Settings. Aware()、set. Desktop. Settings. Aware()、cursor. Flash. Time()、set. Cursor. Flash. Time()、double. Click. Interval()、 set. Double. Click. Interval()、wheel. Scroll. Lines()、set. Wheel. Scroll. Lines()、palette()、set. Palette()、font()、set. Font()、font. Metrics()。 事件处理 exec()、process. Events()、enter_loop()、exit()、quit()。 send. Event()、post. Event()、send. Posted. Events()、remove. Posted. Events()、 has. Pending. Events()、notify()、mac. Event. Filter()、qws. Event. Filter()、x 11 Process. Event()、win. Event. Filter()。 图形用户 界面风格 style()、set. Style()、polish()。 颜色使用 color. Spec()、set. Color. Spec()、qws. Set. Custom. Colors()。 文本处理 set. Default. Codec()、install. Translator()、remove. Translator()、translate()。 窗口部件 main. Widget()、set. Main. Widget()、all. Widgets()、top. Level. Widgets()、desktop()、active. Popup. Widget()、active. Modal. Widget()、clipboard()、 focus. Widget()、win. Focus()、active. Window()、widget. At()。 高级光标处理 has. Global. Mouse. Tracking()、set. Global. Mouse. Tracking()、override. Cursor()、set. Override. Cursor()、restore. Override. Cursor()。 X窗口系统同步 flush. X()、sync. X()。 对话管理 is. Session. Restored()、session. Id()、commit. Data()、save. State()。 线程 lock()、unlock()、locked()、try. Lock()、wake. Up. Gui. Thread()。 杂项 close. All. Windows()、starting. Up()、closing. Down()、type()。

www. gec-edu. org 上下文 函数 窗口函数 show()、hide()、raise()、lower()、close()。 顶级窗口 caption()、set. Caption()、icon()、set. Icon()、icon. Text()、set. Icon. Text()、is.

www. gec-edu. org 上下文 函数 窗口函数 show()、hide()、raise()、lower()、close()。 顶级窗口 caption()、set. Caption()、icon()、set. Icon()、icon. Text()、set. Icon. Text()、is. Active. Window()、set. Active. Window()、show. Minimized()、 show. Maximized()、show. Full. Screen()、show. Normal()。 窗口内容 update()、repaint()、erase()、scroll()、update. Mask()。 几何形状 pos()、size()、rect()、x()、y()、width()、height()、size. Policy()、set. Size. Policy()、size. Hint()、update. Geometry()、layout()、move()、 resize()、set. Geometry()、frame. Geometry()、geometry()、children. Rect()、adjust. Size()、map. From. Global()、map. From. Parent()、 map. To. Global()、map. To. Parent()、maximum. Size()、minimum. Size()、size. Increment()、set. Maximum. Size()、set. Minimum. Size()、 set. Size. Increment()、set. Base. Size()、set. Fixed. Size()。 模式 is. Visible()、is. Visible. To()、visible. Rect()、is. Minimized()、is. Desktop()、is. Enabled. To()、is. Modal()、is. Popup()、is. Top. Level()、 set. Enabled()、has. Mouse. Tracking()、set. Mouse. Tracking()、is. Updates. Enabled()、set. Updates. Enabled()。 观感 style()、set. Style()、cursor()、set. Cursor()、font()、set. Font()、palette()、set. Palette()、background. Mode()、set. Background. Mode()、 color. Group()、font. Metrics()、font. Info()。 键盘焦点函数 is. Focus. Enabled()、set. Focus. Policy()、focus. Policy()、has. Focus()、set. Focus()、clear. Focus()、set. Tab. Order()、set. Focus. Proxy()。 鼠标和键盘捕获 grab. Mouse()、release. Mouse()、grab. Keyboard()、release. Keyboard()、mouse. Grabber()、keyboard. Grabber()。 事件处理器 event()、mouse. Press. Event()、mouse. Release. Event()、mouse. Double. Click. Event()、mouse. Move. Event()、key. Press. Event()、 key. Release. Event()、focus. In. Event()、focus. Out. Event()、wheel. Event()、enter. Event()、leave. Event()、paint. Event()、move. Event()、 resize. Event()、close. Event()、drag. Enter. Event()、drag. Move. Event()、drag. Leave. Event()、drop. Event()、child. Event()、show. Event()、 hide. Event()、custom. Event()。 变化处理器 enabled. Change()、font. Change()、palette. Change()、style. Change()、window. Activation. Change()。 系统函数 parent. Widget()、top. Level. Widget()、reparent()、polish()、win. Id()、find()、metric()。 这是什么的帮助 custom. Whats. This()。 内部核心函数 focus. Next. Prev. Child()、wmapper()、clear. WFlags()、get. WFlags()、set. WFlags()、test. WFlags()。

www. gec-edu. org

www. gec-edu. org