文章目录
- 一、QT简单介绍
- 二、.pro文件介绍
- 三、 命名规范和常用快捷键以及QPushButton简单使用
- 登录窗口布局
- 控件--按钮组
- 其他常用控件介绍
- 自定义控件封装
- Qt中的鼠标事件
- 定时器一
- 定时器二
- event事件分发器
- 事件过滤器
- 绘图事件
- 绘图高级设置
- 绘图设备
- QFile文件读写操作
- QFileInfo文件信息读取
一、QT简单介绍
Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。
== main.cpp==
#include "mywidget.h"
#include <QApplication> //包含头文件 应用程序// 程序入口 argc命令行变量数量 argv命令行变量数组
int main(int argc, char *argv[])
{//应用程序对象 a ,Qt中 有且仅有一个 应用程序对象QApplication a(argc, argv);//创建 MyWidget对象 w MyWidget基类 QWidgetMyWidget w;//窗口默认是不会弹出的,如果想弹出 调用 show方法w.show();//a.exec()进入消息循环机制 pausereturn a.exec();}

运行时候出现Interrupt/Exception caught,解决办法为点击项目,在构建中选中清除系统环境变量。
二、.pro文件介绍
QT += core gui //包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于Qt4版本 才包含widget模块
TARGET = QtFirst //应用程序名 生成的.exe程序名称
TEMPLATE = app //模板类型 应用程序模板
SOURCES += main.cpp\ //源文件
mywidget.cpp
HEADERS += mywidget.h //头文件
.pro就是工程文件(project),它是qmake自动生成的用于生产makefile的配置文件。.pro文件的写法如下:
注释
从“#”开始,到这一行结束。
模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:TEMPLATE = app
app -建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
lib - 建立一个库的makefile。
vcapp - 建立一个应用程序的VisualStudio项目文件。
vclib - 建立一个库的VisualStudio项目文件。
subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。
指定生成的应用程序名
TARGET = QtDemo
工程中包含的头文件
HEADERS += include/painter.h
工程中包含的.ui设计文件
FORMS += forms/painter.ui
工程中包含的源文件
SOURCES += sources/main.cpp sources
工程中包含的资源文件
RESOURCES += qrc/painter.qrc
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
这条语句的含义是,如果QT_MAJOR_VERSION大于4(也就是当前使用的Qt5及更高版本)需要增加widgets模块。如果项目仅需支持Qt5,也可以直接添加“QT += widgets”一句。不过为了保持代码兼容,最好还是按照QtCreator生成的语句编写。
配置信息
CONFIG用来告诉qmake关于应用程序的配置信息。
CONFIG += c++11 //使用c++11的特性
在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项更安全。
三、 命名规范和常用快捷键以及QPushButton简单使用
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>class MyWidget : public QWidget //MyWidget继承QWidget
{Q_OBJECT //Q_OBJECT宏 写了这个宏 就支持了 Qt中的信号和槽机制public:MyWidget(QWidget *parent = 0); //构造函数~MyWidget(); //析构函数
};#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include <QPushButton>
#include "mybutton.h"
#include <QDebug>
//命名规范 以及 快捷键
// 类名 首字母大写 单词与单词之间 首字母大写
// 函数、变量 首字母小写 单词与单词之间 首字母大写
// 快捷键
// 运行 ctrl + R
// 编译 ctrl + B
// 查找 ctrl + F
// 帮助文档 F1
// 字体缩放 ctrl + 鼠标滚轮
// 自动对齐 ctrl + i
// 整行移动 ctrl+ shift + ↑ 或者 ↓
// 同名之间的 .h .cpp切换 F4
// 帮助文档 第一种 : F1 第二种 :左侧按钮 第三种:C:\Qt\Qt5.6.0\5.6\mingw49_32\bin
// 注释快捷键 ctrl + /
MyWidget::MyWidget(QWidget *parent): QWidget(parent) //初始化列表
{//按钮QPushButton * btn = new QPushButton;//btn->show(); //show用顶层方式弹出,如果想在MyWidget窗口中显示,就需要依赖MyWidget窗口//设置父亲btn->setParent(this);//设置文字btn->setText("德玛西亚"); //将char* 隐式类型转为QString//创建按钮第二种方式 窗口会按照 btn2大小进行显示QPushButton * btn2 = new QPushButton("第二按钮",this);//重置窗口大小resize(600,400);//移动第二个按钮btn2->move(100,100);//按钮是否可以 重置大小resize? 可以btn2->resize(50,50);//重置窗口标题setWindowTitle("Qt第一个窗口");//设置固定窗口大小setFixedSize(600,400);//一定程度下 简化了内存回收机制//创建自己的按钮MyButton * myBtn = new MyButton;myBtn->setText("我的按钮");myBtn->move(200,200);myBtn->setParent(this);//Qt坐标系//x为右侧正向 y 以 下侧为正向//点击 myBtn 关闭窗口//参数1 信号的发送者 参数2 发送的信号(信号的地址) 参数3 信号的接受者 参数4 处理的槽函数(函数地址)//connect(myBtn,&MyButton::clicked , this , &MyWidget::close);connect(myBtn,&QPushButton::clicked , this , &QWidget::close);}MyWidget::~MyWidget()
{qDebug() << "MyWidget析构了!";
}


当基类打印的时候并没有析构,而是去寻找子类的析构,然后从子类开始析构。
登录窗口布局
1.Label
2.Line Edit
3.push button
4.通过widget来进行布局
5.Horizontal Spacer 水平弹簧中有个sizeType 将Expanding 变为Fixed
6.打破布局
7.栅格布局(几行几列可以用栅格布局)
8.垂直布局
9.选中QWidget 有个sizePolicy中有个垂直 策略,垂直策略中有个Fixed(将QWidget框变得跟控件一样大)
10.固定窗口大小,将minimumsize和maximumsize
11.QLineEdit 将echoMode修改为Password
控件–按钮组
1.在pushbutton输入的文字前面添加小图标,点qpushbutton,icon,选择资源,点iconSize.设置大小。
2.ToolButton 工具按钮 用于显示图片,如果想显示文字,修改风格:toolButtonStyle 选择ToolButton TextBesidecolor 凸起风格选中autoSize(透明)
3.Radio Button单选框 需要分组,Group Box.
4.多选框 checkBox.
其他常用控件介绍
scroll area 滚动区域
tool box 修改currentItemText为家人
tab widget 修改currentTabText为谷歌
stack widget需要结合其他空间使用,比如按钮。然后设置信号和槽。
combo box 下拉框
spin box 数字的加减
time edit data edit
horizontal scroll bar 水平滑动条
vertical scroll bar 垂直滑动条
vertical slider horizontal slider 配合spin box使用。需要自定义封装控件。
label不仅可以显示文字也可以显示图片
自定义控件封装
1自定义控件封装
1.1添加新文件 - Qt – 设计师界面类 (.h .cpp .ui)
1.2.ui中 设计 QSpinBox和QSlider 两个控件
1.3Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升
1.4实现功能,改变数字,滑动条跟着移动 ,信号槽监听。
1.5提供 getNum 和 setNum对外接口
1.6测试接口
Qt中的鼠标事件

在QLabel中可以找到这三个方法。

当按下鼠标左键或者右键的时候,再移动才会打印:鼠标移动了
在qmouseevent中可以找到鼠标坐标信息以及按键信息。global是基于屏幕的。
//鼠标按下
void mylabel::mousePressEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标按下了";//当鼠标左键按下 提示信息if( ev->button() == Qt::LeftButton){QString str = QString( "鼠标按下了 x = %1 y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标释放了";if( ev->button() == Qt::LeftButton){QString str = QString( "鼠标释放了 x = %1 y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}}//鼠标移动
void mylabel::mouseMoveEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标移动了";if( ev->button() == Qt::LeftButton ){QString str = QString( "鼠标移动了 x = %1 y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}

上边这段代码,鼠标移动没有捕获
//鼠标按下
void mylabel::mousePressEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标按下了";//当鼠标左键按下 提示信息if( ev->button() == Qt::LeftButton){QString str = QString( "鼠标按下了 x = %1 y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标释放了";if( ev->button() ==Qt::LeftButton){QString str = QString( "鼠标释放了 x = %1 y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}}//鼠标移动
void mylabel::mouseMoveEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标移动了";if( ev->buttons()& Qt::LeftButton ){QString str = QString( "鼠标移动了 x = %1 y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}

//设置鼠标追踪后,鼠标进入区域就有移动信息打印出来。
mylabel::mylabel(QWidget *parent) : QLabel(parent)
{//设置鼠标追踪状态setMouseTracking(true);
}

2Qt中的事件
2.1鼠标事件
2.2鼠标进入事件 enterEvent
2.3鼠标离开事件 leaveEvent
2.4鼠标按下 mousePressEvent ( QMouseEvent ev)
2.5鼠标释放 mouseReleaseEvent
2.6鼠标移动 mouseMoveEvent
2.7ev->x() x坐标 ev->y() y坐标
2.8ev->button() 可以判断所有按键 Qt::LeftButton Qt::RightButton
2.9ev->buttons()判断组合按键 判断move时候的左右键 结合 & 操作符
2.10格式化字符串 QString( “ %1 %2 ” ).arg( 111 ).arg(222)
2.11设置鼠标追踪 setMouseTracking(true);
定时器一
在timerevent中选择QTimer Class|Qt Core 5.9
3定时器1
3.1利用事件 void timerEvent ( QTimerEvent * ev)
3.2启动定时器 startTimer( 1000) 毫秒单位
3.3timerEvent 的返回值是定时器的唯一标示 可以和ev->timerId 做比较
定时器二
4定时器2
4.1利用定时器类 QTimer
4.2创建定时器对象 QTimer * timer = new QTimer(this)
4.3启动定时器 timer->start(毫秒)
4.4每隔一定毫秒,发送信号 timeout ,进行监听
4.5暂停 timer->stop
event事件分发器

bool myLabel::event(QEvent *e)
{//如果是鼠标按下 ,在event事件分发中做拦截操作if(e->type() == QEvent::MouseButtonPress){QMouseEvent * ev = static_cast<QMouseEvent *>(e);//QEvent是QMouseEvent的父类。QString str = QString( "Event函数中::鼠标按下了 x = %1 y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;return true; //true代表用户自己处理这个事件,不向下分发}//其他事件 交给父类处理 默认处理return QLabel::event(e);
}
5event事件
5.1用途:用于事件的分发
5.2也可以做拦截操作,不建议
5.3bool event( QEvent * e);
5.4返回值 如果是true 代表用户处理这个事件,不向下分发了
5.5e->type() == 鼠标按下 …
事件过滤器
// 步骤2 重写 eventfilter事件
bool Widget::eventFilter(QObject * obj , QEvent * e)
{if(obj == ui->label){if(e->type() == QEvent::MouseButtonPress){QMouseEvent * ev = static_cast<QMouseEvent *>(e);QString str = QString( "事件过滤器中::鼠标按下了 x = %1 y = %2 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;return true; //true代表用户自己处理这个事件,不向下分发}}//其他默认处理return QWidget::eventFilter(obj,e);
}

6事件过滤器
6.1在程序将时间分发到事件分发器前,可以利用过滤器做拦截
6.2步骤
6.2.11、给控件安装事件过滤器
6.2.22、重写 eventFilter函数 (obj , ev)
绘图事件
7QPainter 绘图
7.1绘图事件 void paintEvent() 可以不用显示调用这个函数
7.2声明一个画家对象 QPainter painter(this) this指定绘图设备
7.3画线、画圆、画矩形、画文字
7.4设置画笔 QPen 设置画笔宽度 、风格
7.5设置画刷 QBrush 设置画刷 风格
绘图高级设置
8QPainter高级设置
8.1抗锯齿 效率低
8.1.1painter.setRenderHint(QPainter::Antialiasing);
8.2对画家进行移动
8.2.1painter.translate(100,0);
8.2.2保存状态 save
8.2.3还原状态 restore
8.3如果想手动调用绘图事件 利用update
8.4利用画家画图片 painter.drawPixmap( x,y,QPixmap( 路飞) )
绘图设备
9QPaintDevice绘图设备
9.1QPixmap QImage QBitmap(黑白色) QPicture QWidget
9.2QPixmap 对不同平台做了显示的优化
9.2.1QPixmap pix( 300,300)
9.2.2pix.fill( 填充颜色 )
9.2.3利用画家 往pix上画画 QPainter painter( & pix)
9.2.4保存 pix.save( “路径”)
9.3Qimage 可以对像素进行访问
9.3.1使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32);
9.3.2其他流程和QPixmap一样
9.3.3可以对像素进行修改 img.setPixel(i,j,value);
9.4QPicture 记录和重现 绘图指令
9.4.1QPicture pic
9.4.2painter.begin(&pic);
9.4.3保存 pic.save( 任意后缀名 )
9.4.4重现 利用画家可以重现painter.drawPicture(0,0,pic);
QFile文件读写操作
10QFile 对文件进行读写操作
10.1QFile进行读写操作
10.2QFile file( path 文件路径)
10.3读
10.3.1file.open(打开方式) QIODevice::readOnly
10.3.2全部读取 file.readAll() 按行读 file.readLine() atend()判断是否读到文件尾
10.3.3默认支持编码格式 utf-8
10.3.4利用编码格式类 指定格式 QTextCodeC
10.3.5QTextCodec * codec = QTextCodec::codecForName(“gbk”);
10.3.6//ui->textEdit->setText( codec->toUnicode(array) );
10.3.7文件对象关闭 close
10.4写
10.4.1file.open( QIODevice::writeOnly / Append)
10.4.2file.write(内容)
10.4.3file.close 关闭
QFileInfo文件信息读取
11QFileInfo 读取文件信息
11.1QFileInfo info(路径)
11.2qDebug() << “大小:” << info.size() << " 后缀名:" << info.suffix() << " 文件名称:"<<info.fileName() << " 文件路径:"<< info.filePath();
11.3 qDebug() << “创建日期:” << info.created().toString(“yyyy/MM/dd hh:mm:ss”);
11.4 qDebug() << “最后修改日期:”<<info.lastModified().toString(“yyyy-MM-dd hh:mm:ss”);
12

















