第三课、Qt的诞生和本质------------------狄泰软件学院

一、GUI用户界面元素

(1)、GUI应用程序是由固定的窗口元素所构成

(2)、操作系统提供了创建用户界面元素所需要的函数

(3)、各自功能不同的函数依次调用,从而创建出界面元素

(4)、操作系统提供的元素函数无法直接映射到界面元素

二、面向对象的GUI应用程序设计

1、GUI应用程序的应用

(1)、GUI应用程序是为了解决非科学计算问题而诞生的

(2)、GUI应用程序适用于非专业的日常生活领域

(3)、面向过程程序设计方法学不适合GUI程序设计

(4)、面向对象程序设计方法学更适合GUI程序设计

2、用面向对象的方法看待GUI程序设计

(1)、用面向对象的方法看待GUI界面元素

(2)、所有的界面元素都可以看做实际的对象

(3)、GUI用户界面是由各不相同的对象组成的

(4)、如主窗口对象

A、菜单对象

B、按钮对象

C、文本框对象

3、GUI应用程序非常适合采用面向对象的方法学

(1)、将界面元素定义成对应的类

(2)、通过抽象和封装可以隐藏界面元素的细节

(3)、程序的创建过程就是组合不同元素对象的过程

//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();
}
View Code

//Application.h

#pragma  once#include <windows.h>class Application
{
public:Application(HINSTANCE hInstance, LPSTR lpCmdLine);bool exec();
};
View Code

//Application.cpp

#include "Application.h"Application::Application(HINSTANCE hInstance, LPSTR lpCmdLine)
{}bool Application::exec()
{MSG msg = { 0 };//进入消息循环while ( GetMessage(&msg, NULL, 0, 0)){//翻译并转换系统消息TranslateMessage(&msg);//分发消息到对应的消息处理函数DispatchMessage(&msg);}return TRUE;
}
View Code

//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();
};
View Code

//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;
}
View Code

//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();
};
View Code

//MainWidow.cpp

#include "MainWindow.h"const wchar_t MainWindow::STYLE_NAME[] = L"MainForm";//主窗口定义
BOOL MainWindow::DefineMainWindow(HINSTANCE hInstance)
{static WNDCLASS WndClass = { 0 };//系统结构类型,用于描述窗口样式
WndClass.style         = 0;WndClass.cbClsExtra    = 0;WndClass.cbWndExtra    = 0;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(0);break;default://调用系统提供的默认消息处理函数return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}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);               //刷新窗口
}
View Code

//PushButton.h

#pragma  once#include "Widget.h"class PushButton : public Widget
{
public:PushButton(Widget* win, const wchar_t* text);
};
View Code

//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,//创建后窗口元素的显示风格50,                                   //窗口元素在主窗口左上角x坐标50,                                   //窗口元素在主窗口左上角y坐标200,                                  //窗口元素宽度60,                                   //窗口元素高度win->hwnd(),                          //父窗口(HMENU)this,                          //窗口元素ID值hInstance,                            //窗口元素属于当前应用程序
                        NULL);
}
View Code

三、QT的本质

(1)、QT是利用面向对象方法学开发的一套GUI组件库

(2)、QT将不同操作系统的GUI细节封装于类的内部

(3)、QT提供一套跨平台的类用于开发GUI程序

(4)、QT遵循经典的GUI应用程序开发模式

四、小结

(1)、GUI程序开发更适合采用面向对象方法学

(2)、所有的界面元素都可以看做是实际的对象

(3)、GUI用户界面是由各不相同的对象组成的

(4)、QT是利用面向对象方法学开发的一套GUI组件库

(5)、QT将GUI细节封装于类的内部,具有跨平台的特性  

转载于:https://www.cnblogs.com/gui-lin/p/6385174.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark RDD算子介绍

Spark学习笔记总结 01. Spark基础 1. 介绍 Spark可以用于批处理、交互式查询&#xff08;Spark SQL&#xff09;、实时流处理&#xff08;Spark Streaming&#xff09;、机器学习&#xff08;Spark MLlib&#xff09;和图计算&#xff08;GraphX&#xff09;。 Spark是MapReduc…

java 写tb级文件_三管齐下!TB 级文件的上传性能瞬间被优化 100 倍!

作者 | 中华石杉责编 | 伍杏玲本文经授权转载石杉的架构笔记(ID&#xff1a;shishan100)这篇文章我们来看看&#xff0c;世界上最优秀的分布式文件系统HDFS&#xff0c;是如何对超大文件的上传做性能优化的&#xff1f;首先&#xff0c;我们还是通过一张图来看一下文件上传的大…

CentOS7下安装Redis — 单节点

2019独角兽企业重金招聘Python工程师标准>>> 1. 环境准备 安装编译所需要的包&#xff1a; yum install gcc tcl 2. 下载redis http://download.redis.io/releases/redis-3.2.7.tar.gz 3. 安装redis ## 创建redis的安装目录 mkdir /usr/local/redis## 解压redis tar…

笔记本中美化代码的方法

这里向大家推荐一个很好用的记笔记软件,微软的OneNote,这个笔记软件,支持分区和分区组的创建,而且入门简单,界面简洁,很适合从word过渡过来的人来记笔记! 不过如果直接记笔记,对于程序员来说,可能希望代码在笔记本上更好看一些,那么应该怎么办呢?下面提供了在OneNote中,让代码…

工具使用——印象(汇总)

作者&#xff1a;桂。 时间&#xff1a;2017-02-09 23:11:30 链接&#xff1a;http://www.cnblogs.com/xingshansi/articles/6384097.html 说明&#xff1a;转载请注明出处&#xff0c;谢谢。 前言 本文仅仅介绍印象笔记的使用&#xff0c;至于挖掘机哪家强&#xff0c;本文不…

深入理解Python的logging模块:从基础到高级

在Python编程中&#xff0c;日志记录是一种重要的调试和错误追踪工具。Python的logging模块提供了一种灵活的框架&#xff0c;用于发出日志消息&#xff0c;这些消息可以被发送到各种输出源&#xff0c;如控制台、文件、HTTP GET/POST位置等。本文将深入探讨Python的logging模块…

centos7安装java6_CentOS7.6安装jdk1.8

2、登录Linux服务器&#xff0c;通过rz命令将jdk导入服务器如果没有rz命令 需要先安装lrzszyum install lrzsz -y3、将jdk压缩包解压到指定路径 -C 指定路径4、配置环境变量编辑/etc/profile文件 在末尾加上以下内容 wq保存退出source /etc/profile文件 使配置文件生效export J…

人生苦短,我用python——当我在玩python的时候我玩些什么 -

程序的基本思路 用一个txt文件记录电脑的一天内累计使用时间累计使用时间超过若干小时就会自动关机程序开机自动运行 为什么我最后选择了python 想着怎么写、搜资料的时候就发现Java并不适合&#xff0c;虽然不是不能实现&#xff0c;但有好几个问题解决起来都有点麻烦。对我这…

Twisted入门教程(5)

2019独角兽企业重金招聘Python工程师标准>>> 第五部分&#xff1a;由Twited支持的诗歌下载服务客户端 你可以从这里从头开始阅读这个系列 抽象地构建客户端 在第四部分中&#xff0c;我们构建了第一个使用Twisted的客户端。它确实能很好地工作&#xff0c;但仍有提高…

**print('人生苦短 我爱Python')**

print(‘人生苦短 我爱Python’) 一、变量 **""" 1.代码自上而下执行 2_运算符和表达式.一行一句&#xff0c;不要把多个语句写到一行上&#xff0c;可读性不好 3中文只能出现在引号里&#xff0c;其他地方不能出现中文 4不能随意缩进 """**pr…

笔记本(华硕UL80VT)软件超频setFSB

Warning !!!If you are a beginner, do not use this software. This software is for power users only. Use "SetFSB.exe" at your own risk.试了setfsb各种版本&#xff0c;基本不能打开。还有官网的免费版&#xff0c;居然不能用&#xff0c;真是很奇怪。 官网&a…

Node.js~在linux上的部署

我们以centOS为例来说说如何部署node.js环境 一 打开centos,然后开始下载node.js包 curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - yum -y install nodejs 二 安装gcc环境 yum install gcc-c make 安装完成! 三 安装nodejs的npm,这是一个包程序工具…

LeetCode题解-3-Longest Substring Without Repeating Characters

2019独角兽企业重金招聘Python工程师标准>>> 解题思路 首先要读懂题目&#xff0c;它要求的是找到最长的子串&#xff0c;并且子串中没有出现重复的字符。 我的想法&#xff0c;是用一个map存储每个字符最后出现的位置&#xff0c;还要有个变量start&#xff0c;它用…

java从哪学到哪_Java JVM怎么学习啊?从哪方面入手?

叮当猫咪一、 JVM的生命周期  1. JVM实例对应了一个独立运行的java程序它是进程级别  a) 启动。启动一个Java程序时&#xff0c;一个JVM实例就产生了&#xff0c;任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点  b) 运行。m…

JMeter处理Cookie与Session

cookie 和session 的区别&#xff1a; 1、cookie数据存放在客户的浏览器上&#xff0c;session数据放在服务器上。 2、cookie不是很安全&#xff0c;别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当…

Maximum sum(poj 2479)

题意&#xff1a;给一段数列&#xff0c;将这个数列分成两部分&#xff0c;使两部分的最大子段和的和最大&#xff0c;输出和/*看数据没想到是(O)n的算法&#xff0c;求出从前向后的最大子段和和从后向前的最大子段和&#xff0c;然后枚举断点。 第一次提交不小心折在数组最小值…

蚂蚁分类信息系统 5.8 信息浏览量后台自定义设置

mymps 蚂蚁分类信息是一款基于PHPMySQL的建站系统,为在各种服务器上架设分类信息以及地方门户网站提供完美的解决方案. mymps5.8 下载 蚂蚁分类系统 5.8下载 蚂蚁分类系统下载 mymps下载 蚂蚁分类信息系统 5.8 原信息浏览量后台无法自定义&#xff0c;现增加后台自定义浏览量…

python编写四位数验证码

def verifycode(request):#引入绘图模块from PIL import Image, ImageDraw, ImageFont#引入随机函数模块import random#定义变量&#xff0c;用于画面的背景色、宽、高bgcolor (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))width 100h…

php 计算数据偏离度,关于偏离度的测算方法

2015年6月技术总结——关于偏离度的测算方法研究院公用事业部 路璐引言《原理》中说“偏离度是指每一种偿债来源与财富创造能力的距离&#xff0c;所体现的是偿债来源对债务安全的保障程度&#xff0c;唯有通过揭示偿债来源与财富创造能力偏离度才能真正区别每一种偿债来源的风…

Django中celery配置总结

情景&#xff1a; 用户发起request&#xff0c;并等待response返回。在本些views中&#xff0c;可能需要执行一段耗时的程序&#xff0c;那么用户就会等待很长时间&#xff0c; 造成不好的用户体验&#xff0c;比如发送邮件、手机验证码等。 使用celery后&#xff0c;情况就不…