QT之QMainWindow窗体应用
这是我参考C++ Qt5 范例开发大全作者:Longki
大部分在书中都有我只是敲了一边。。
1.1 第一个程序 Hello World 。。。。。。。。。。。。。。。。。。。。。。
窗体应用
窗体基类说明 ,控制窗体大小,窗体初始位置及背景色 。。。。。。。。。。。。。。。。。。。。。。 。
1.4 修改标题栏图标 。。。。。。。。。。。。。。。。。。。。。。。。。 。
1.5 移动无边框窗体 。。。。。。。。。。。。。。。。。。。。。。。。。 。
1.6 去掉标题栏中最大化、最小化按钮 。。。。。。。。。。。。。。。。。 。
1.7 多窗体调用 。。。。。。。。。。。。。。。。。。。。。。。。。。。 。
1.8 字体形状窗体 。。。。。。。。。。。。。。。。。。。。。。。。。。 。
1.3第一个程序 Hello World
1、 实例需求
在窗口输出 “Hello World”文字。
打开 Qt Creator -文件-新建文件或项目-应用程序-Qt Gui 应用-选择,如图 1.1


图 1.1 图 1.2
图 1.2 将项目放到指定目录,便于管理。单击[下一步]


图 1.3 图 1.4
图 1.3 默认编译文件存放目录,图 1.4 直接点击[下一步],后面详细说明三种基类用途。

mainwindow.cpp 源代码说明
/** 1~3 行包含引用类,1~2 行是根据所选基类自动生成,3 行引用QLabel 控件类。*/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel> //引用QLabel类
/** 自动生成,功能绘制窗体并显示。*/
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
//创建一个QLabel控件
QLabel *label=new QLabel(this);
//QLabel控件显示文字内容
label->setText("Hello World");
//QLabel控件显示位置
/** QRect(参数 1,参数 2,参数 3,参数 4)
参数 1:在窗体中 X 轴参数
参数 2:在窗体中 Y 轴参数
参数 3:QLabel 控件宽度
参数 4:QLabel 控件高度*/
label->setGeometry(QRect(50,50,200,25));
//窗体标题
this->setWindowTitle("Qt5.1 窗体应用");
//窗体最大 300*300
this->setMaximumSize(300,300);
//窗体最小 300*300
this->setMinimumSize(300,300);
//默认窗体居中显示,如果想要更改用 move 或setGeometry
this->move(100,100);
//背景红色
this->setStyleSheet("background:red");
/** 自动生成,回收机制,用完实例后释放内存。*/
MainWindow::~MainWindow()
delete ui;
}
Main.cpp 源代码说明
/** 1~2行包含引用头文件 */
#include "mainwindow.h"
#include <QApplication>
/** 入口函数,即程序执行入口。
参数 1:argc 命令行总的参数个数。
参数 2:argv[]是 argc 的参数。*/
int main(int argc, char *argv[])
//创建 QApplication 对象 a 参数为argc,argv。
QApplication a(argc, argv);
//实例对象 MainWindow 对象
MainWindow w;
//显示对象
w.show();
//循环执行 QApplication 对象实例
return a.exec();
}
4、 目录结构说明
打开项目目录,debug 文件夹与 release 文件夹内部文件是根据编辑器选择而自动生成,文件夹内是编译后的可执行文件
进入 QtOne 文件夹,文件功能说明。
main.cpp 通常叫做入口源文件
mainwindow.cpp 实例窗口源文件
mainwindow.h 实例头文件
mainwindow.ui 设计页面
QtOne.pro 项目工程文件
QtOne.pro.user 系统文件
窗体基类说明

图 1.1
当创建项目,会发现编辑器提供三个基类,分别为:
QMainWindow、QWidget、QDialog,三个基类的区别说明如下。
1、 QMainWindow
QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。
主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周 围 菜单、工具条和一个状态条。
QMainWindow 常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单项或者工 具条按钮时,槽会被调用。
2、 QWidget
QWidgt 类是所有用户界面对象的基类。
窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的, 并且它们按 Z 轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
3、 QDialog
QDialog 类是对话框窗口的基类。
对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。
QDialog 可以是模态对话框也可以是非模态对话框。QDialog 支持扩展性并且可以提供返回值。它们可以有默认按钮。
修改标题栏图标
1、 实例需求

修改标题栏图标。
2、 实例参照
要实现修改标题栏图标功能,首先需要有一个图片,最好是 16x16 像素的 ICO 图片,
这里在实例参照中已提供图片供使用。
第一步:
在Qt03 项目中创建文件夹 resource,文件夹名字可以自己定义,将准备好的 ICO 图片放入文件夹。
第三部:

Qt Creator – 文件 – 新建文件或项目 – 文件和类中选择 Qt – Qt 资源文件,如图 1.1
图 1.1
单击选择-弹出图 1.2 给资源文件起个名字,可自己定义。


图 1.2 图 1.3
单击image.qrc 文件 – 单击[添加]按钮 [添加前缀] –在单击 [添加文件]选择刚刚项目中准备
的ICO 图片,单击 resource/QT.ico 给图片起一个别名,这里命名为 ico。
第四部:在 mainwindow.cpp 中添加代码。
//窗体标题
this->setWindowTitle("Qt5.1 窗体应用");
//窗体 ICO 图片,如图不起别名,后缀直接写图片全名。
this->setWindowIcon(QIcon(":/new/prefix1/ico"));
移动无边框窗体
1、 实例需求

移动无边框窗体。
2、 实例参照
第一步:打开 mainwindow.h 头文件,添加代码。
#include <QMouseEvent> //引用鼠标类头文件
#include <QPushButton> //引用按钮类头文件
//定义鼠标三种状态方法protected:
//鼠标按下
void mousePressEvent(QMouseEvent *e);
//鼠标移动
void mouseMoveEvent(QMouseEvent *e);
//鼠标释放
void mouseReleaseEvent(QMouseEvent *e);
//定义QPoint 对象private:
QPushButton *btClose;
QPoint last;
第二部:代开 mainwindow.cpp 源代码文件,添加代码。
//标题名
this->setWindowTitle("移动无边框窗体");
//去掉标题栏
this->setWindowFlags(Qt::FramelessWindowHint);
//实例一个按钮控件,因为去掉标题栏后,窗体没有关闭按钮了。
//所以自己添加一个按钮实现关闭功能。
btClose = new QPushButton(this); btClose->setText("关闭");
//按钮点击事件
connect(btClose,SIGNAL(clicked()),this,SLOT(close()));
//获取鼠标点定位窗体位置
void MainWindow::mousePressEvent(QMouseEvent *e)
last = e->globalPos();
void MainWindow::mouseMoveEvent(QMouseEvent *e)
int dx = e->globalX() - last.x(); int dy = e->globalY() - last.y();
last = e->globalPos(); move(x()+dx,y()+dy);
void MainWindow::mouseReleaseEvent(QMouseEvent *e)
int dx = e->globalX() - last.x();
int dy = e->globalY() - last.y();
move(x()+dx, y()+dy);
}
去掉标题栏中最大化、最小化按钮
1、 实例如图

2、 实例参照
光盘/QtCode/QtTwo/Qt05/ Qt05.pro
3、 实例实现
//关闭按钮失效
//this->setWindowFlags(Qt::WindowMinMaxButtonsHint);
//去掉最大化、最小化按钮,保留关闭按钮
this->setWindowFlags(Qt::WindowCloseButtonHint);
多窗体调用
1、 实例需求
从MainWindow 窗体点击按钮打开 MainWindow2 窗体。

2、 实例参照
光盘/QtCode/QtTwo/Qt06/ Qt06.pro
3、 实例实现
第一步:创建完项目之后,在点击文件-新建文件或项目-文件和类-Qt-Qt 设计师界面类如图 1.1

图 1.1

单击选择弹出图 1.2
图 1.2
单击下一步,弹出图 1.3

图 1.3
单击下一步,此时项目中又多了一个 MainWindow2 窗体。
打开 MainWindow.h 头文件,编写代码。
#include <QPushButton> //引用QPushButonn 类
#include <mainwindow2.h> //引用mainwindow2 类
//实例按钮private:
QPushButton *button;
MainWindow2 w2;
//实例方法private slots:
void showMainwindow2();
打开 MainWindow.cpp 文件,编写代码。
//实例 QPushButonn 控件
button = new QPushButton(this);
//按钮显示位置
button->setGeometry(QRect(50,50,100,25));
//按钮值
button->setText("按钮");
//点击事件connect(button,SIGNAL(clicked()),this,SLOT(showMainwindow2()));
//调用方法
void MainWindow::showMainwindow2()
//显示 MainWindow2 窗体w2.show();
}
字体形状窗体
1、 实例需求
将窗体背景色透明,根据图片形状显示窗体。

2、 实例参照
/QtCode/QtTwo/Qt07/ Qt07.pro
3、 实例实现
将透明图片文字拷贝到项目中,前面已经讲述过怎么添加资源文件,这里就不在赘述了。
添加图片之后,打开 MainWindow.cpp 文件编写如下代码。
//去掉标题栏
this->setWindowFlags(Qt::FramelessWindowHint);