1.QT += core gui 、、包含的模块,所述的包含的类可以使用
2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets// 4版本以上加入widgets
3. TARGET = QT_20190705//,目标 生成的.exe程序名称
4. TEMPLATE = app // 模板
5. SOURCES...//源文件
6. HEADERS..//头文件
7. mian.cpp
- #include "widget.h" //头文件
#include // 应用程序类
// argc 命令行变量的数量 argv 命令行变量数组
QApplication a(argc, argv);//a应用程序对象,Qt中有且就有一个应用程序对象,获取操作,例如鼠标点击
Widget w; // 创建一个自定义窗口对象
w.show(); //窗口对象弹出函数
return a.exec();//进入消息循环机智,阻塞代码
8.
#ifndef WIDGET_H
#endif // WIDGET_H //防止头文件相互包含,类似于#program
#include //父类(基类)
Q_OBJECT// Q_OBJECT提供了Qt中的信号和槽的机制
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
/*
* 命名规范
* 类名首字母大写 单词与单词之前首字母大写
* 函数,变量...首字母大写
* 常用快捷键
* ctrl +R 运行
* ctrl + B 编译
* F1 帮助文档 选中一个变量,按住F1
* 注释快捷键ctrl + /
* 字体的缩放 ctrl +鼠标滚轮
* 整行代码的移动 ctrl +shift + 上箭头或者下箭头
* 查找 ctrl + f
* 自动对齐 ctrl+ i
* 同名之间的.h和.cpp切换 ctrl + F4
* 帮助文档 F1,左侧列表,帮助文档另外的程序
*
*
*
*/
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QPushButton *btn = new QPushButton;
// btn->show();// 默认是用顶层的方式弹出窗口
//预期想要按钮依赖大窗口弹出
btn->setParent(this);//给button找一个父类
btn->setText("周五");
QPushButton *btn2 = new QPushButton("下雨");//在相同的位置会覆盖原来之前同位置的东西
btn2->setParent(this);
btn2->move(100,0);
this->resize(600,400);//设置窗口大小
this->setWindowTitle("fiist program");//设置窗口标题
this->setFixedSize(600,400); //设置窗体的固定大小
}
Widget::~Widget()
{
delete ui;
}
左上角是(0,0)点,往右→增加,往下增加
connect(信号的发出者(指针),信号内容(地址),信号的接受者(指针),处理信号(槽函数地址))
connect(btn2,&QPushButton::clicked,this,&Widget::close);//
// 其中QPushButton换成其子类也可以,实现点击button2关闭窗口
//缺点: 参数类型 不做检测,原因在于SIGNAL和SLOT括号下的内容转为字符串SIGNAL(“hungry(int))”)
//优点: 参数类型比较直观
connect(zt,SIGNAL(hungry(QString)),st,SLOT(treat(QString)));
// classover();
[capture](parameters)mutable->return-type
{
statement;
}
[函数对象参数](操作符重载函数参数)mutable->返回值{函数体}
QMenuBar *bar = menuBar();
setMenuBar(bar); //设置到窗口中
QMenu*fileMenu = bar->addMenu("文件");
QMenu *editMenu = bar->addMenu("编辑");
//添加菜单项
QAction *newaction = fileMenu->addAction("新建");
//添加分割线
fileMenu->addSeparator();
QAction *openaction = fileMenu->addAction("打开");//返回一个QAction
//工具栏 可以有多个
QToolBar * toolbar = new QToolBar(this);
//addToolBar(toolbar);默认上部分
addToolBar(Qt::LeftToolBarArea,toolbar);//第一个参数是枚举值,
toolbar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
toolbar->setFloatable(false);//设置浮动
toolbar->setMovable(false);//设置移动
//工具中添加小控件
QPushButton *btn = new QPushButton("按钮",this);
toolbar->addWidget(btn);
//工具栏中添加·菜单项
toolbar->addAction(newaction);
toolbar->addSeparator();
toolbar->addAction(openaction);
//状态栏 只有一个
QStatusBar *statu = statusBar();
//将状态栏放入状态栏
setStatusBar(statu);
QLabel *lable = new QLabel("左侧信息",this);//一个专门显示文字的对象
//将标签 放入到 状态栏中
statu->addWidget(lable);
QLabel* lable2 = new QLabel("右侧信息",this);
statu->addPermanentWidget(lable2);//从右往左
//铆接部件,浮动窗口 可以有多个
QDockWidget * dock = new QDockWidget("铆接部件",this);
addDockWidget(Qt::BottomDockWidgetArea, dock);// 放在核心部件的下面
// 可以设置停靠范围
dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
//this->addDockWidget(dock);
//核心部件 只能有一个
QTextEdit * edit = new QTextEdit(this);
setCentralWidget(edit);
//在新建的菜单项上-显示图片
// ui->actionnew->setIcon(路径);
//资源文件 使用方式 " :+前缀名+文件名"
ui->actionnew->setIcon(QIcon(":/img/pdfext.png"));
ui->actionopen->setIcon(QIcon(":/img/noteext.png"));
// 对话框的分类
// 模态对话框 不可以对其他窗口进行操作
// 非模态对话框 可以对其他窗口进行操作
//1.模态对话框
QDialog dlg(this);
dlg.exec();//阻塞功能,使得它一下代码不能执行
//非模态对话框
// QDialog dlg2(this);
// dlg2.show(); 这样的话有问题,因为在函数里面的变量会被释放
QDialog *dlg2 = new QDialog(this);
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号属性 在关闭窗口的时候释放空间
//弹出提示对话框
#include
// Qmessagebox 错误对话框
QMessageBox::critical(this,"错误","wrong");
// 信息对话框
QMessageBox::information(this,"tishi","you have a wrong");
//提问对话框
// 参数1 父窗口 参数2 标题 参数3 文本 参数4 按键类型 参数5 默认关联回车
if(QMessageBox::Save== QMessageBox::question(this,"wrong","do you have some question",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
qDebug()<<"点击率保存";
}
else {
qDebug()<<"cannel";
}
// warning meesagebox
QMessageBox::warning(this,"wrong","some wrong");
// 文件对话框 参数1 父窗口 参数2 标题 参数3 默认打开路径 参数4 过滤后缀名
//使用时加上头文件
QString filename = QFileDialog::getOpenFileName(this,"打开文件","D:\\dalaocode\\dalao for Dev","*.cpp");
qDebug()<<"打开的文件是"<<filename;
//颜色对话框
QColor color = QColorDialog::getColor(QColor(255,0,0));
qDebug()<<color.red()<<color.green()<<color.blue();
//字体对话框
bool ok;
QFont font = QFontDialog::getFont(&ok,QFont("黑体",36));
qDebug()<<font.family()<<font.pointSize()<<font.italic()<<font.bold();
// 什么字体 ,字号,是否倾斜, 是否加粗
ui->radio_man->setChecked(true);//设置默认选项
//第二个信号有一个参数,可以被槽函数捕捉
connect(ui->checkBox,&QCheckBox::stateChanged,[=](int state){
qDebug()<<"state is"<<state;
});
//listwidget
QListWidgetItem * item = new QListWidgetItem("锄禾日当午");
ui->listWidget->addItem(item);
item->setTextAlignment(Qt::AlignHCenter);// 设置对齐
// QstringList
QStringList list;
list<<"锄禾日当午"<<"汗滴禾下如"<<"谁知盘中餐"<<"粒粒皆辛苦";
ui->listWidget->addItems(list);
// treewidget树控件的使用
//设置头
ui->treeWidget->setHeaderLabels(QStringList()<<"hero"<<"introduce of hero");
//Treewidgeet 中每个项目都称为QTeeWidgetItem
QTreeWidgetItem * Pitem = new QTreeWidgetItem(QStringList()<<"power");
QTreeWidgetItem * Sitem = new QTreeWidgetItem(QStringList()<<"speed");
QTreeWidgetItem * Iitem = new QTreeWidgetItem(QStringList()<<"IQ");
//添加根节点
ui->treeWidget->addTopLevelItem(Pitem);
ui->treeWidget->addTopLevelItem(Sitem);
ui->treeWidget->addTopLevelItem(Iitem);
QStringList hero1,hero2,hero3,hero4,hero5,hero6;
hero1<<"耀"<<"战士,不会玩";
hero2<<"典韦"<<"战士fnahfgafhg";
hero3<<"耀"<<"战士,不会玩";
hero4<<"典韦"<<"战士fnahfgafhg";
hero5<<"耀"<<"战士,不会玩";
hero6<<"典韦"<<"战士fnahfgafhg";
//add children node
QTreeWidgetItem *L1 = new QTreeWidgetItem(hero1);
QTreeWidgetItem *L2 = new QTreeWidgetItem(hero2);
//QTreeWidgetItem *L3 = new QTreeWidgetItem(hero3+hero4);
Pitem->addChild(L1);
Sitem->addChild(L2);
//Iitem->addChild;
//tablewidget 使用
//设置列
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"性别"<<"性别"<<"age");
//设置行数
ui->tableWidget->setRowCount(5);
//设置具体的内容
ui->tableWidget->setItem(0,0,new QTableWidgetItem("yase"));
QList<QString> namelist;
namelist<<"亚瑟"<<"安其拉"<<"王昭君"<<"曹操"<<"刘备";
QStringList sexlist;
sexlist<<"男"<<"女"<<"nan"<<"女"<<"nan";
for(int i=0;i<5;i++)
{
int col = 0;
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(namelist[i]));
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexlist.at(i)));
//int 转Qstring
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18+i)));
col = 0;
}
// 点击切换按钮实现切换
int cou=0;
connect(ui->qiehuan,&QPushButton::clicked,[&](){
ui->stackedWidget->setCurrentIndex(2);
if(cou==3)
cou=0;
}); //切换失败,我也不知道为什么
ui->comboBox->addItem("奔驰");
ui->comboBox->addItem("宝马");
ui->comboBox->addItem("宏碁");
// 点击按钮 定位到拖拉机
connect(ui->con_combo,&QPushButton::clicked,[=](){
ui->comboBox->setCurrentIndex(2);
//ui->comboBox->setCurrentText("宝马"); 两种形式
});
//利用label 显示图片
ui->labeld_imgge->setPixmap(QPixmap(":/img/pdfext.png"));
//利用label显示动图
QMovie *movie = new QMovie(":/img/hello.gif");
ui->label_gif->setMovie(movie);
// 播放movie动图
movie->start();
void myLabel::enterEvent(QEvent *)
{
//qDebug()<<"mouse enter";
}
// 捕获鼠标离开
void myLabel::leaveEvent(QEvent *){
//qDebug()<<"mouse leave";
}
// 鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev){
// 判断只有左键按下才能打印信息
if(ev->button()==Qt::LeftButton)
{
qDebug()<<"mouse 按下";
}
}
//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev) {
qDebug()<<"mouse 释放";
}
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev){
if(ev->buttons()& Qt::LeftButton)//有点迷糊,大概意思就是移动的时候可能是左右键同时移动
//联合移动
{
QString str = QString("鼠标按下了 x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
}
}
id1 = startTimer(1000);// 会返回一个int型的标志
id2 = startTimer(2000);
}
void Widget::timerEvent(QTimerEvent *e)
{
if(e->timerId()==id1)
{
static int num = 1;// 保证每次函数调用完之后值任然有效
ui->label_2->setText(QString::number(num++));
}
else {
static int num2 = 1;
ui->label_3->setText(QString::number(num2++));
}
}//定时器事件
//利用QTimer定时器的类,实现定时功能
QTimer * timer = new QTimer(this);// 添加到对象树上
timer->start(500);
connect(timer,&QTimer::timeout,[=](){
static int num3 = 1;
ui->label_4->setText(QString::number(num3++));
});
//点击button 实现定时器的暂停
connect(ui->pushButton,&QPushButton::clicked,[=](){
timer->stop();
});
bool myLabel::event(QEvent *e){
if(e->type()== QEvent::MouseButtonPress)
{
QMouseEvent* ev = static_cast<QMouseEvent*>(e);
QString str = QString("鼠标按下了 x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
return true;//代表如果是,鼠标按下,用户自己处理
}
//其他事件 交给父类处理 默认处理
return QLabel::event(e);
}
利用事件过滤器,可以做更高级的拦截
使用事件过滤器有两步:
//利用事件过滤器给第一个label做一个更高级的时间拦截
//步骤1, 给label安装事件过滤器
ui->label->installEventFilter(this);
//步骤2
}
// 参数1 对比控件用 参数2 对比事件
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("evenFilter 中鼠标按下了 x=%1 y=%2").arg(ev->x()).arg(ev->y());
qDebug()<<str;
return true;//代表如果是,鼠标按下,用户自己处理
}
}
return QWidget::eventFilter(obj,e);
}
void Widget::paintEvent(QPaintEvent *){
//声明画家对象,在窗口设备中绘制图片
QPainter painter(this);
QBrush brus(Qt::cyan);// 设置画刷
brus.setStyle(Qt::Dense3Pattern);
painter.setBrush(brus);// 让画家使用画刷
//划线
painter.drawLine(QPoint(0,0),QPoint(100,100));
//画圆(特殊的椭圆)
painter.drawEllipse(QPoint(100,100),50,50);
//画一个矩形
painter.drawRect(QRect(20,20,50,50));
// 画文字
painter.drawText(QPoint(100,100),"SB__SYD");
// 指定画笔
QPen pen(QColor(255,0,0));
//设置笔宽(像素)
pen.setWidth(3);
//设置笔的风格
pen.setStyle(Qt::DotLine);
// 让画家使用这支笔
painter.setPen(pen);
// 画文字
painter.drawText(QRect(100,100,100,100),"SB__SYD");
}
// 高级
QPen pen(QColor(255,0,0));
pen.setWidth(3);
//pen.setStyle(Qt::DotLine);
painter.setPen(pen);
painter.drawEllipse(QPoint(100,100),50,50);
// 设置抗锯齿 效率比较低
painter.setRenderHint(QPainter::HighQualityAntialiasing);
painter.drawEllipse(QPoint(250,100),50,50);
painter.drawRect(QRect(20,20,50,50));
painter.translate(QPoint(100,0));// 改变画家初始坐标系
painter.save();//保持画家的状态
painter.drawRect(QRect(20,20,50,50));
painter.translate(QPoint(100,0));
painter.restore();//还原画家的状态
painter.drawRect(QRect(20,20,50,50));
//利用画家绘制图片
posx += 10;
//超出屏幕,重置posx
if(posx>this->width())
{
posx = 10;
}
painter.drawPixmap(posx,100, QPixmap(":/img/pdfext.png"));
//绘图事件
posx = 10;//
// 点击按钮实现图片的移动
connect(ui->pushButton,&QPushButton::clicked,[=](){
// 手动调用paintEvent函数 利用 update,重新绘制图片1·
posx += 10;
update();
});
//QPixmap 做绘图的设备
//对不同的平台做了显示的优化
// QPixmap pix(300,300);// 声明一张纸的大小
// pix.fill(Qt::white);//change the background to white
// QPainter painter(&pix);
// painter.setPen(QPen(Qt::red));// a red pen;
// painter.drawEllipse(QPoint(100,100),100,100);
// // save
// pix.save("D:\\dalaocode\\Qt\\Qt20190711001\\one.png");//
//QImage 做绘图的设备
//可以对像素进行访问
// QImage img(300,300,QImage::Format_RGB32);
// img.fill(Qt::white);//change the background to white
// QPainter painter(&img);
// painter.setPen(QPen(Qt::red));// a red pen;
// painter.drawEllipse(QPoint(100,100),100,100);
// // save
// img.save("D:\\dalaocode\\Qt\\Qt20190711001\\two.png");//
QPicture pic;// 记录和重现Qpainter的各条命令
QPainter painter;
painter.begin(&pic);
painter.setPen(QPen(Qt::blue));// a red pen;
painter.drawEllipse(QPoint(100,100),100,100);
painter.end();
pic.save("D:\\dalaocode\\Qt\\Qt20190711001\\iii.lyb");
void Widget::paintEvent(QPaintEvent *){//系统调用这个函数
// QImage img;
// img.load(":/img/pdfext.png");
// QPainter painter(this);
// for(int i=50;i<100;i++)
// {
// for(int j=50;j<100;j++){
// QRgb value = qRgb(255,0,0);
// img.setPixel(i,j,value);
// }
// }
// painter.drawImage(0,0,img);
QPainter painter(this);
// 重现Qpicture 的绘图命令
QPicture pic;
pic.load("D:\\dalaocode\\Qt\\Qt20190711001\\iii.lyb");
painter.drawPicture(30,30,pic);
}
// 点击选择文件,将文件中的内容读取到文本框中
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString filePath = QFileDialog::getOpenFileName(this,"选择文件","D:\\软件专用储存\\chrome","(*.txt *.png)");
//qDebug()<
// 将文件路径放入到 linetext中
if(filePath.isEmpty())
{
QMessageBox::warning(this, "打开失败","文件路径为空");
return;
}
ui->lineEdit->setText(filePath);
QTextCodec *code = QTextCodec::codecForName("gbk");
//将文件内容 放入到 textEdit中
QFile file(filePath);//默认支持格式utf-8
// 设置打开方式
file.open(QIODevice::ReadOnly);//以只读的方式打开
QByteArray arr;
//arr = file.readAll(); 读取所有
while(!file.atEnd())
{
arr += file.readLine();//一行一行的读
}
//显示数据
/*ui->textEdit->setText(code->toUnicode(arr));*/// 将指定字符串转化为目标格式的gdk格式
ui->textEdit->setText(code->toUnicode(arr));
file.close();// 关闭文件
file.open(QIODevice::Append);//追加的方式写
file.write("hello");
file.close();
});
//文件信息类
QFileInfo info(filePath);
qDebug()<<"size:"<<info.size()<<"后缀名:"<< info.suffix()<<"文件名:"<<info.fileName()<<"filePath:"<<info.filePath();
qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss");
qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");
windeployat 程序所在路径及其文件名】
即有所依赖的库就将所需要的库安装成功
HM nis Edit 软件可以生成一个安装包