第3课 QT的诞生和本质
1. GUI用户界面元素
(1)操作系统提供了创建用户界面元素所需要的函数
(2)各种功能不同的函数依次调用,从而创建出界面元素
(3)操作系统提供的原生函数无法直接映射到界面元素
2. 面向对象的GUI程序设计
(1)GUI应用程序是为了解决非科学计算问题而诞生的
(2)GUI应用程序适用于非专业的日常生活领域
(3)面向过程程序设计方法学不适合GUI程序设计
(4)面向对象程序设计方法学更适合GUI程序设计
3. 另一种眼界
(1)用面向对象方法学看待GUI界面元素
(2)所有界面元素都可以看作实际的对象
(3)GUI用户界面是由各不相同的对象组成的(如菜单对象、按钮对象、文本框对象等)
(4)用面向对象的思想开发GUI应用程序(界面元素对应哪些类?)
①将界面元素定义为对应的类
②通过抽象和封装可以隐藏界面元素的细节
③程序的创建过程就是组合不同界面元素对象的过程
【实例分析】面向对象的方法创建GUI程序
//Main.cpp
#include <windows.h>
#include "Application.h"
#include "MainWindow.h"
#include "PushButton.h" BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Application a(hInstance, lpCmdLine); MainWindow w(hInstance, L"Main Window");
PushButton b(&w, L"My Button"); w.show(); return a.exec();
}
//Application.h
#pragma once #include <windows.h> class Application
{
public:
Application(HINSTANCE hInstance, LPSTR lpCmdLine);
bool exec();
};
//Application.cpp
#include "Application.h" Application::Application(HINSTANCE hInstance, LPSTR lpCmdLine)
{ } bool Application::exec()
{
MSG msg = { }; //进入消息循环
while ( GetMessage(&msg, NULL, , ))
{
//翻译并转换系统消息
TranslateMessage(&msg); //分发消息到对应的消息处理函数
DispatchMessage(&msg);
} return TRUE;
}
//Widget.h
#pragma once #include <windows.h> class Widget
{
protected:
Widget* m_parent;
HWND m_hwnd;
public:
Widget();
Widget(Widget* parent);
HWND hwnd();
Widget* parent();
};
//Widget.cpp
#include "Widget.h" Widget::Widget()
{
m_parent = NULL;
} Widget::Widget(Widget* parent)
{
m_parent = parent;
} HWND Widget::hwnd()
{
return m_hwnd;
} Widget* Widget::parent()
{
return m_parent;
}
//MainWidow.h
#pragma once #include "Widget.h" class MainWindow : public Widget
{
protected:
static const wchar_t STYLE_NAME[]; //主窗口定义
BOOL DefineMainWindow(HINSTANCE hInstance);
//主窗口创建
void CreateMainWindow(HINSTANCE hInstance, const wchar_t* title);
//主窗口消息处理函数
static LRESULT CALLBACK WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam); public:
MainWindow(HINSTANCE hInstance, const wchar_t* title);
void show();
};
//MainWindow.cpp
#include "MainWindow.h" const wchar_t MainWindow::STYLE_NAME[] = L"MainForm"; //主窗口定义
BOOL MainWindow::DefineMainWindow(HINSTANCE hInstance)
{
static WNDCLASS WndClass = { };//系统结构类型,用于描述窗口样式 WndClass.style = ;
WndClass.cbClsExtra = ;
WndClass.cbWndExtra = ;
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW); //定义窗口背景色
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //定义鼠标样式
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //定义窗口左上角图标
WndClass.hInstance = hInstance; //定义窗口样式属于当前应用程序
WndClass.lpfnWndProc = (WNDPROC)WndProc; //窗口消息处理函数
WndClass.lpszClassName = STYLE_NAME; //窗口样式名
WndClass.lpszMenuName = NULL; //将定义好的窗口样式注册到系统上
return RegisterClass(&WndClass);
} //主窗口创建
void MainWindow::CreateMainWindow(HINSTANCE hInstance, const wchar_t* title)
{
m_hwnd = CreateWindow(STYLE_NAME, //通过定义好的窗口样式创建主窗口
title, //主窗口标题
WS_OVERLAPPEDWINDOW,//创建后主窗口的显示风格
CW_USEDEFAULT, //主窗口左上角x坐标
CW_USEDEFAULT, //主窗口左上角y坐标
CW_USEDEFAULT, //主窗口宽度
CW_USEDEFAULT, //主窗口高度
NULL, //父窗口
NULL, //主窗口菜单
hInstance, //主窗口属于当前应用程序
NULL);
} //主窗口消息处理函数
LRESULT CALLBACK MainWindow::WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage();
break;
default:
//调用系统提供的默认消息处理函数
return DefWindowProc(hWnd, message, wParam, lParam);
} return ;
} MainWindow::MainWindow(HINSTANCE hInstance, const wchar_t* title) :Widget(NULL)
{
DefineMainWindow(hInstance); CreateMainWindow(hInstance, title);
} void MainWindow::show()
{
ShowWindow(m_hwnd, SW_SHOWNORMAL); //显示窗口
UpdateWindow(m_hwnd); //刷新窗口
}
//PushButton.h
#pragma once #include "Widget.h" class PushButton : public Widget
{
public:
PushButton(Widget* win, const wchar_t* text);
};
//Pushbutton.cpp
#include "PushButton.h" PushButton::PushButton(Widget* win, const wchar_t* text)
{
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(win->hwnd(), GWL_HINSTANCE); m_hwnd = CreateWindow(L"button", //通过系统预定义的窗口样式创建元素
text, //窗口元素标题
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,//创建后窗口元素的显示风格
, //窗口元素在主窗口左上角x坐标
, //窗口元素在主窗口左上角y坐标
, //窗口元素宽度
, //窗口元素高度
win->hwnd(), //父窗口
(HMENU)this, //窗口元素ID值
hInstance, //窗口元素属于当前应用程序
NULL);
}
4. QT的本质
(1)QT是利用面向对象方法学开发的一套GUI组件库
(2)QT将不同操作系统的GUI细节封装于类的内部
(3)QT提供一套跨平台的类,用于开发GUI程序
(4)QT遵循经典的GUI应用程序开发模式
5. 小结
(1)GUI程序开发更适合采用面向对象方法学
(2)所有的界面元素都可以看作实际的对象
(3)GUI用户界面是由各不相同的对象组成的
(4)QT是利用面向对象方法学开发的一套GUI组件库
(5)QT将GUI细节封装于类的内部,具有跨平台的特性
第3课 QT的诞生和本质的更多相关文章
- Qt的诞生和本质
有没有发现,在这个主函数里面没有了消息循环了.消息循环到哪里去了呢? 我们知道,每个GUI应用程序都有消息循环,一般都需要将消息循环while那个函数写到main的最后位置.那既然如此,为了代码复用, ...
- 第32课 Qt中的文件操作
1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...
- 第30课 Qt中的文本编辑组件
1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...
- 第5课 Qt Creator工程介绍
1. QT Creator工程管理(一个工程包含不同类型的文件) (1).pro项目文件 (2).pro.user用户配置描述文件 (3).h头文件 (4).cpp源文件 (5).ui界面描述文件 ( ...
- 第54课 Qt 中的多页面切换组件
1. 多页面切换组件(QTabWidget) (1)能够在同一个窗口中自由切换不同页面的内容 (2)是一个容器类型的组件,同时提供友好的页面切换方式 2. QTabWidget的使用方式 (1)在应用 ...
- 第47课 Qt中的调色板
1. QPalette类 (1)QPalette类提供了绘制QWidget组件的不同状态所使用的颜色. (2)QPalette对象包含了3个状态的颜色描述 ①激活颜色组(Active):组件获得焦点使 ...
- 第39课 Qt中的事件处理(下)
1. 事件的传递过程 (1)操作系统检测到用户动作时,会产生一条系统消息,该消息被发送到Qt应用程序 (2)Qt应用程序收到系统消息后,将其转化为一个对应的QEvent事件对象,并调用QObject: ...
- 第38课 Qt中的事件处理(上)
1. GUI程序原理回顾 (1)图形界面应用程序的消息处理模型 (2)思考:操作系统发送的消息如何转变为Qt信号 2. Qt中的事件处理 (1)Qt平台将系统产生的消息转换为Qt事件 ①Qt事件是一个 ...
- 第11课 Qt中的字符串类
1. 历史遗留问题和解决方案 (1)历史遗留问题 ①C语言不支持真正意义上的字符串 ②C语言用字符数组和一组函数实现字符串操作 ③C语言不支持自定义类型,因此无法获得字符串类型 (2)解决方案 ①从C ...
随机推荐
- 使用 Redis
Redis(https://redis.io/),既不像 SQLite 以表的形式存储数据,也不像 MongoDB 允许以嵌套结构存储和查询,它是一种内存数据库结构,即将数据缓存在内存中.它将键—值( ...
- key寻址算法
分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 hash 算法 来了一个 ...
- [原]visual studio 将(无扩展名)文件以某种(C++)方式阅读(映射)
工具 选项 文本编辑器 文件扩展名 选择“将无扩展····”后面设置一下就可以
- 计算机网络七层协议模型 “开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)
计算机网络七层协议模型 作者:Ryan 时间:2013年10月7日 一.物理层(Physical Layer) OSI模型的最低层或第一层,规定了激活.维持.关闭通信端点之间的机械特性.电气特性 ...
- VNC Viewer连接Cent OS 时的 复制粘帖 功能
虽然 VNC Viewer 比起 vsphere Client 来, 感觉性能差一点. 但毕竟也是个选择. 找了一下 它的这个 功能. 运行一下 vncconfig & 就可以了. 实测好用. ...
- 秒转为时分秒格式js
秒转为时分秒格式 function formatSeconds(value) { if(value == undefined) { value = 0; } var second = parseInt ...
- ES6介绍二 函数的增强
ES6对于函数的使用新增了很多实用的API,JS的函数跟很多后台语言PHP,ASP.NET开始看齐: 1. 参数默认值: 以前我们为了给函数创建默认值,必须用一种冗杂的语句,而且有歧义的语句. //E ...
- 『转』G Data InternetSecurity 2014 – 免费3个月
G Data来自德国的顶级杀毒软件,采用BitDefender+CloseGap双引擎,屡获AV-TEST防護率100%.不多介绍,目前2014中文版没有上市.活动地址:点此进入官方网站:点此进入申请 ...
- linux下部署tomcat服务器之安装jdk
如果一开始安装过jdk的可以卸载 rpm -qa | grep java rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.x8 ...
- Alpha冲刺(11/10)
拖鞋旅游队团队事后诸葛亮会议 前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10054510.html 时间:2018-12-1 20:00 地 ...