例如:
/*********************************************
命名规范
类名, 首字母大写,单词和单词之间首字母大写
函数名 变量名称 ,首字母可以小写,单词和单词之间首字母大写
快捷键
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
查找 ctrl + f
整行移动 ctrl + ↑↓
帮助文档 F1
自动对齐 ctrl + i
同名之间.h和.cpp切换 F4
**********************************************/
->代码如下(示例):
#include "widget.h"
#include //包含一个应用程序的类的头文件
//main程序入口 argc命令行变量的数量 argv命令行变量的数组
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //a应用程序对象,在QT中有且只有一个
Widget w; //窗口对象 w mywidget父类 -> QWidget
w.show(); //窗口对象 默认不会显示,必须调用show方法显示窗口
return a.exec(); //让应用程序对象进入消息循环,后续代码不执行
}
代码如下(示例):
#include "widget.h"
#include "ui_widget.h"
#include //按钮控件的头文件
/*********************************************
命名规范
类名, 首字母大写,单词和单词之间首字母大写
函数名 变量名称 ,首字母可以小写,单词和单词之间首字母大写
快捷键
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
查找 ctrl + f
整行移动 ctrl + ↑↓
帮助文档 F1
自动对齐 ctrl + i
同名之间.h和.cpp切换 F4
**********************************************/
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/*****************按钮创建方式一****************************/
QPushButton * btn1 =new QPushButton;
// btn->show(); //以顶层方式显示窗口控件,会另建一个窗口
btn1->setParent(this);//让btn1对象依赖在Widget窗口中显示,this代表指向当前对象Widget的指针
btn1->setText("按钮"); //显示文本
/*****************按钮创建方式二****************************/
QPushButton * btn2 =new QPushButton("按钮",this); //按控件大小创建敞窗口
btn2->move(100,100); //移动btn2按钮
btn2->resize(60,40); //重置btn2按钮大小
resize(600,400); //重置窗口大小
setFixedSize(600,400); //设置固定窗口大小
/*****************设置窗口标题****************************/
setWindowTitle("窗口-运行");
}
Widget::~Widget()
{
delete ui;
}
void clicked(bool checked = false) //点击
void pressed() //按下
void released() //释放
void toggled(bool checked) //切换,开或关
bool close() //关闭
void hide()
void lower()
void raise()
void repaint()
void setDisabled(bool disable)
void setEnabled(bool)
void setFocus()
void setHidden(bool hidden)
void setStyleSheet(const QString &styleSheet)
virtual void setVisible(bool visible)
void setWindowModified(bool)
void setWindowTitle(const QString &)
void show()
void showFullScreen()
void showMaximized()
void showMinimized()
void showNormal()
void update()
代码如下(示例):
/*****参数1 信号发送者,参数2 发送的信号(函数的地址),参数3 信号的接收者,参数4 处理的槽函数**********/
// connect(myBtn, &MyPushButton::clicked,this,&Widget::close);
connect(myBtn, &QPushButton::clicked,this,&QWidget::close); //函数地址可以直接写父类
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
/*
自定义信号写到signals下面
返回值是void,只需要声明,不需要实现
可以有参数,可以重载
*/
void hungry();
};
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
/*
返回值是void,需要声明,需要实现
可以有参数,可以重载
*/
void treat();
signals:
};
Student.cpp实现代码如下(示例):
void Student::treat()
{
qDebug()<<"请老师吃饭";
}
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师的对象
this->zt = new Teacher(this);
//创建一个学生的对象
this->st = new Student(this);
//连接
connect(zt,&Teacher::hungry,st,&Student::treat);
//调用下课函数
classIsOver();
}
void Widget::classIsOver()
{
//下课函数调用后,触发老师饿了的信号,自定义的信号触发emit
emit zt->hungry();
}
Widget::~Widget()
{
delete ui;
}
//连接 有参数
//函数指针->函数地址
void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
void(Student:: *studentSlot)(QString) = &Student::treat;
connect(zt,teacherSignal,st,studentSlot);
// qDebug() << "请老师吃饭,老师要吃" << foodName;
//QString->char * 就不会打印出""号,要先用.toUtf8()转QByteArray再.data()转char *
qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
/*
返回值是void,需要声明,需要实现
可以有参数,可以重载
*/
void treat();
void treat(QString foodName); //重载,需要在.cpp中实现
signals:
};
void Student::treat(QString foodName)
{
// qDebug() << "请老师吃饭,老师要吃" << foodName;
//QString->char * 就不会打印出""号,要先用.toUtf8()转QByteArray再.data()转char *
qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
}
lass Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
/*
自定义信号写到signals下面
返回值是void,只需要声明,不需要实现
可以有参数,可以重载
*/
void hungry();
void hungry(QString foodName); //重载
};
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师的对象
this->zt = new Teacher(this);
//创建一个学生的对象
this->st = new Student(this);
//连接 无参数
// connect(zt,&Teacher::hungry,st,&Student::treat);
// //调用下课函数
// classIsOver();
//连接 有参数
//函数指针->函数地址
void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
void(Student:: *studentSlot)(QString) = &Student::treat;
connect(zt,teacherSignal,st,studentSlot);
classIsOver();
}
void Widget::classIsOver()
{
//下课函数调用后,触发老师饿了的信号,自定义的信号触发emit
// emit zt->hungry();
emit zt->hungry("宫保鸡丁");
}
Widget::~Widget()
{
delete ui;
}
//点击一个按钮,再触发下课
QPushButton * btn = new QPushButton("下课",this);
this->resize(600,400); //重置窗口大小
//点击按钮触发下课,信号触发槽函数
connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
//无参信号和槽连接,点击按钮触发下课,信号触发信号
void(Teacher:: *teacherSignal2)(void) = &Teacher::hungry;
void(Student:: *studentSlot2)(void) = &Student::treat;
connect(zt,teacherSignal2,st,studentSlot2);
connect(btn,&QPushButton::clicked,zt,teacherSignal2);//点击按钮触发下课,信号触发信号
//无参信号和槽连接,点击按钮触发下课,信号触发信号
void(Teacher:: *teacherSignal2)(void) = &Teacher::hungry;
void(Student:: *studentSlot2)(void) = &Student::treat;
connect(zt,teacherSignal2,st,studentSlot2);
connect(btn,&QPushButton::clicked,zt,teacherSignal2);//点击按钮触发下课,信号触发信号
disconnect(zt,teacherSignal2,st,studentSlot2); //引用哪个断开哪个
//[](){}是函数声明,后面加()是函数调用,调用之后才能使用,[函数对象参数](操作符重载函数参数)mutable->返回值{函数体}
[=]()
{
btn->setText("上课");
}();
//[](){}是函数声明,后面加()是函数调用,调用之后才能使用
[=]()
{
btn->setText("上课");
}();
QPushButton * btn1 = new QPushButton;
int m = 10;
connect(btn1,&QPushButton::clicked,this,[m]()mutable{m = 100 + 10; qDebug()<<m;});
qDebug()<<m;
QPushButton * btn2 = new QPushButton;
btn2->setText("关闭");
btn2->move(100,0);
btn2->setParent(this);
connect(btn2,&QPushButton::clicked,this,[=](){
// this->close(); //按下按钮关闭窗口
// emit zt->hungry("宫保鸡丁"); //按下按钮打印相关的函数写的内容
btn2->setText("aaa"); //按下按钮后按钮名称改为aaa
});
connect连接中第三个参数为this时第四个参数为Lambda表达式时,可以将this省略
QPushButton * btn2 = new QPushButton;
btn2->setText("关闭");
btn2->move(100,0);
btn2->setParent(this);
connect(btn2,&QPushButton::clicked,[=](){
// this->close(); //按下按钮关闭窗口
// emit zt->hungry("宫保鸡丁"); //按下按钮打印相关的函数写的内容
btn2->setText("aaa"); //按下按钮后按钮名称改为aaa
});
#include
resize(600,400); //重置窗口大小
/*****************创建菜单栏,只能有一个****************************/
QMenuBar * bar = menuBar(); //创建菜单栏(系统本身有的不需要放到对象树上)
setMenuBar(bar); //设置菜单栏,到窗口中
QMenu * fileMenu = bar->addMenu("文件"); //创建菜单-文件(QMenu * fileMenu是为了设置一个fileMenu指针方便后续使用)
// fileMenu->addAction("新建"); //“文件”中创建一个“新建”
QAction * newAction = fileMenu->addAction("新建"); //“文件”中创建一个“新建”,设置一个参数让工具栏共用新建
fileMenu->addSeparator(); //分隔符
QAction * openAction = fileMenu->addAction("打开"); //“文件”中创建一个“打开”
QMenu * editMenu = bar->addMenu("编辑"); //创建菜单-编辑
editMenu->addAction("上一步"); //“编辑”中创建一个“上一步”
editMenu->addSeparator(); //分隔符
editMenu->addAction("下一步"); //“编辑”中创建一个“下一步”
#include
#include //添加该头文件可以使用打印功能
#include
/*****************创建工具栏,可以有多个****************************/
QToolBar * toolBar = new QToolBar(this); //(new出来的需要手动放到对象树上)
addToolBar(Qt::LeftToolBarArea,toolBar); //Qt::LeftToolBarArea让工具栏在左侧,不加默认上面
toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea); //允许停靠范围
toolBar->setFloatable(false); //false不允许浮动
toolBar->setMovable(false); //false不允许移动
//添加工具
toolBar->addAction(newAction);
toolBar->addSeparator(); //分隔符
toolBar->addAction(openAction);
//添加控件
QPushButton * btn = new QPushButton("另存为",this);
toolBar->addWidget(btn); //把按钮放到工具栏中
#include
#include
/*****************创建状态栏,最多只有一个***************************************************************************************/
QStatusBar * stBar = statusBar(); //创建状态栏
setStatusBar(stBar); //设置到窗口中
QLabel * label = new QLabel("提示信息",this);
stBar->addWidget(label); //放到标签栏中-左侧
QLabel * label2 = new QLabel("右提示信息",this);
stBar->addPermanentWidget(label2); //放到标签栏中-右侧
#include
#include
/*****************铆接部件,可以有多个***************************************************************************************/
QDockWidget * dockWidget = new QDockWidget("浮动",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidget); //Qt::BottomDockWidgetArea-放到下面
/*****************设置中心部件,只能有一个***************************************************************************************/
QTextEdit * edit = new QTextEdit(this);
setCentralWidget(edit); //设置为中心部件
// ui->actionnew->setIcon(QIcon("D:/QT-5.12/project/day03_Source/Picture/05.jpg"));//添加路径,文件在电脑中
//使用QT添加资源 ":+前缀名+文件名"
ui->actionnew->setIcon(QIcon(":/Picture/05.jpg"));//把文件添加到工程中
ui->actionopen->setIcon(QIcon(":/Picture/06.jpg"));
#include
// QDialog dlg(this); //创建对话框
// dlg.resize(200,100); //重置大小
// dlg.exec(); //模态对话框
//对话框只执行一次
// QDialog dlg2(this); //创建对话框
// dlg2.resize(200,100); //重置大小
// dlg2.show(); //非模态对话框
// 对话框可以一直执行被显示
QDialog * dlg2 = new QDialog(this); //创建对话框
dlg2->resize(200,100); //重置大小
dlg2->setAttribute(Qt::WA_DeleteOnClose); //设置关闭此小窗口时被释放
dlg2->show(); //非模态对话框
#include
#include
// QMessageBox::critical(this,"critical","错误");
// QMessageBox::information(this,"information","信息");
// QMessageBox::warning(this,"warning","警告");
if(QMessageBox::Save == QMessageBox::question(this,"question","问题",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
qDebug() << "选择保存";
}
else
{
qDebug() << "选择取消";
}
#include
// QColorDialog::getColor(QColor(255,0,0));//颜色对话框 QColor(255,0,0,156)r=255,g=0,b=0,透明度=156
QColor color = QColorDialog::getColor(QColor(255,0,0));//颜色对话框 QColor(255,0,0,156)r=255,g=0,b=0,透明度=156
qDebug() << "r=" << color.red() << "g=" << color.green() << "b=" << color.red();
#include
//打开文件对话框 参数1 父类,参数2 标题,参数3 路径,参数4 过滤文件格式
// QFileDialog::getOpenFileName(this,"打开文件","C:/Users/USER/Desktop","(*.txt)");//不打印返回值
QString str = QFileDialog::getOpenFileName(this,"打开文件","C:/Users/USER/Desktop","(*.txt)");
qDebug() << str;//打印返回值 是打开文件的路径
#include
//字体对话框font.family()打印之后带引号,加上.toUtf8().data()之后不带
bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("仿宋",36));
qDebug() << "字体:" << font.family().toUtf8().data() << "字号" << font.pointSize() << "是否加粗" << font.bold() << "是否倾斜" << font.italic();
ui->rBtnMan->setChecked(true);//设置单选按钮,男默认选中(先在UI中改名)
connect(ui->rBtnWoman,&QRadioButton::clicked,[=](){
qDebug() << "选中女";//选中女 进行打印
connect(ui->cBox,&QCheckBox::stateChanged,[=](int state){
qDebug() << state;//打印0、2,在UI中选中tristate后变为0、1、2其中0未选,1半选,2选中
#include
/******Qt::AlignRight右边 Qt::AlignJustify下边********************/
QListWidgetItem * item = new QListWidgetItem("写一首诗"); //ListWidget
ui->listWidget->addItem(item); //将其放到控件中第一行
item->setTextAlignment(Qt::AlignHCenter);//水平居中
QListWidgetItem * item2 = new QListWidgetItem("写两首诗"); //ListWidget
ui->listWidget->addItem(item2); //将其放到控件中第二行
item2->setTextAlignment(Qt::AlignRight|Qt::AlignJustify);//右下
/******无法做水平居中*******************/
QStringList list;
list << "第一句" << "第二句" << "第三句" << "第四句";
ui->listWidget->addItems(list);
/****************treeWidget控件*********************************************************/
ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"英雄简介"); //设置水平标题
QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList()<<"力量"); //创建目录-力量
ui->treeWidget->addTopLevelItem(liItem); //将创建的目录-力量,放到顶层目录中
QStringList heroL1;
heroL1 << "项羽" << "前排坦克"; //子节点内容
QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);
liItem->addChild(l1); //添加子节点到力量目录下
QStringList heroL2;
heroL2 << "白起" << "前排坦克"; //子节点内容
QTreeWidgetItem * l2 = new QTreeWidgetItem(heroL2);
liItem->addChild(l2); //添加子节点到力量目录下
/********************创建目录***************************************************/
QTreeWidgetItem * minItem = new QTreeWidgetItem(QStringList()<<"敏捷"); //创建目录-敏捷
QTreeWidgetItem * zhiItem = new QTreeWidgetItem(QStringList()<<"智力"); //创建目录-智力
/********************将目录放到顶层***************************************************/
ui->treeWidget->addTopLevelItem(minItem); //将创建的目录-敏捷,放到顶层目录中
ui->treeWidget->addTopLevelItem(zhiItem); //将创建的目录-智力,放到顶层目录中
/********************将目录放到某一目录下方***************************************************/
QStringList heroL3;
heroL3 << "兰陵王" << "打野"; //子节点内容
QTreeWidgetItem * l3 = new QTreeWidgetItem(heroL3);
minItem->addChild(l3); //添加子节点到敏捷目录下
QStringList heroL4;
heroL4 << "诸葛亮" << "中单法师"; //子节点内容
QTreeWidgetItem * l4 = new QTreeWidgetItem(heroL4);
zhiItem->addChild(l4); //添加子节点到智力目录下
/************TableWidget控件******************************************************/
ui->tableWidget->setColumnCount(3); //设置列数-3
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");//设置水平表头
ui->tableWidget->setRowCount(5); //设置行数-5
// ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));//直接写第0行,第0列,内容“亚瑟”
/************用for循环填充内容****************/
QStringList nameList; //写法1
nameList << "亚瑟" << "关羽" << "马超" << "花木兰" << "阿离";
QList<QString> sexList; //写法2
sexList << "男" << "男" << "男" << "女" << "女";
for(int i=0;i<5;i++)
{
int col = 0;
ui->tableWidget->setItem(i,col,new QTableWidgetItem(nameList[i]));//写法1 访问越界就没了
ui->tableWidget->setItem(i,col,new QTableWidgetItem(sexList.at(i)));//写法2 访问越界会抛出异常
ui->tableWidget->setItem(i,col,new QTableWidgetItem(QString::number(i+18)));//写法2int转QString
}
/******************************栈控件使用*************************************/
ui->stackedWidget->setCurrentIndex(2); //设置默认界面
connect(ui->btn_area,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(0);
}); //设置第一个界面-btn_area按钮名称-setCurrentIndex(0)页面标识
connect(ui->btn_ToolBox,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(2);
}); //设置第二个界面-btn_ToolBox按钮名称-setCurrentIndex(2)页面标识
connect(ui->btn_Tab,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(1);
}); //设置第三个界面-btn_Tab按钮名称-setCurrentIndex(1)页面标识
/******************************下拉窗控件使用*************************************/
ui->comboBox->addItem("第一个");
ui->comboBox->addItem("第二个");
ui->comboBox->addItem("第三个");
//
connect(ui->btn_select,&QPushButton::clicked,[=](){
ui->comboBox->setCurrentIndex(2); //方法一:选中第2号中的内容
// ui->comboBox->setCurrentText("第三个"); //方法二:直接显示内容
});
#include //.gif动图需要添加头文件
/******************************利用QLabel显示图片*************************************/
ui->lab_Image->setPixmap(QPixmap(":/Picture/08.jpg"));
/******************************利用QLabel显示动图.jif格式*************************************/
QMovie * movie = new QMovie(":/Picture/01.gif"); //设置路径
ui->lab_Move->setMovie(movie); //填写指针
movie->start(); //开始 播放
/*********QSpinBox移动,QSlider跟着移动*****************/
void(QSpinBox:: * spSignal)(int) = &QSpinBox::valueChanged;
connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);
/*********QSlider移动,QSpinBox跟着移动*****************/
connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
#include
在smallWigdet.h中的public中添加函数(声明)
void setNum(int num);//设置数字
int getNum();//获取数字
在smallWigdet.c中添加函数(实现)
void SmallWigdet::setNum(int num)//设置数字
{
ui->spinBox->setValue(num);
}
int SmallWigdet::getNum()//获取数字
{
return ui->spinBox->value();
}
在主函数中添加函数(connect连接)
//获取当前值
connect(ui->btn_get,&QPushButton::clicked,[=](){
qDebug() << ui->widget->getNum();
});
//设置到一半
connect(ui->btn_set,&QPushButton::clicked,[=](){
ui->widget->setNum(50);
});
void enterEvent(QEvent * event); //鼠标进入-声明
void leaveEvent(QEvent * ); //鼠标离开-声明
myLabel.cpp文件
void myLabel::enterEvent(QEvent * event) //鼠标进入-实现,myLabel::是该函数作用域
{
qDebug() << "鼠标进入";
}
void myLabel::leaveEvent(QEvent * ) //鼠标离开-实现
{
qDebug() << "鼠标离开";
}
void mousePressEvent(QMouseEvent *ev); //鼠标按下-声明
void mouseReleaseEvent(QMouseEvent *ev); //鼠标松开-声明
void mouseMoveEvent(QMouseEvent *ev); //鼠标移动-声明
myLabel.cpp文件
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
setMouseTracking(true); //设置鼠标追踪状态,ture为真,此时下放按键判断需要去掉
}
void myLabel::mousePressEvent(QMouseEvent *ev) //鼠标按下-实现
{
// .arg(ev->x())-基于控件的x *************** .arg(ev->globalX())基于屏幕的x
if(ev->button() == Qt::LeftButton) //鼠标左键按下
{
QString str = QString("鼠标按下 x=%1 y=%2 gx=%3 gy=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
qDebug() << "左键";
}
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev) //鼠标松开-实现
{
if(ev->button() == Qt::RightButton) //鼠标右键按下
{
QString str = QString("鼠标松开 x=%1 y=%2 gx=%3 gy=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
qDebug() << "右键";
}
}
void myLabel::mouseMoveEvent(QMouseEvent *ev) //鼠标移动-实现
{
/*移动为持续事件需要用buttons联合按键实现,里面集成左右中间按键,用&来判断*/
// if(ev->buttons() &Qt::MidButton) //鼠标中间键按下
// {
// QString str = QString("鼠标移动 x=%1 y=%2 gx=%3 gy=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
// qDebug() << str;
// qDebug() << "中间键";
// }
QString str = QString("鼠标移动 x=%1 y=%2 gx=%3 gy=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
void timerEvent(QTimerEvent *); //重写定时器事件-声明
int id1; //定时器一的标识-声明(用来区分定时器,只用一个定时器时可以不写)
int id2; //定时器二的标识-声明(用来区分定时器,只用一个定时器时可以不写)
Widget.cpp文件(只有一个定时器时可以不用if判断和id标识直接用startTimer(1000);)
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
id1 = startTimer(1000); //参数1 间隔(毫秒)
id2 = startTimer(2000);
}
void Widget::timerEvent(QTimerEvent *ev)
{
if(ev->timerId() == id1)
{
static int num = 1; //int num = 1;(每次都执行) static int num = 1;(局部变量,只执行一次)
ui->label_2->setText(QString::number(num++));
}
if(ev->timerId() == id2)
{
static int num = 1;
ui->label_3->setText(QString::number(num++));
}
}
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//定时器方法二
QTimer * timer = new QTimer(this);
timer->start(500); //毫秒
connect(timer,&QTimer::timeout,[=](){
static int num = 1; //int num = 1;(每次都执行) static int num = 1;(局部变量,只执行一次)
ui->label_4->setText(QString::number(num++));
});
}
//点击按钮停止计时器
connect(ui->btn,&QPushButton::clicked,[=](){
timer->stop();
});
connect(ui->btn2,&QPushButton::clicked,[=](){
timer->start();
});
bool event(QEvent *e); //通过event事件分发器拦截鼠标按键
bool myLabel::event(QEvent *e)
{
if(e->type() == QEvent::MouseButtonPress) //鼠标按下,在event中做拦截,e->type() == 鼠标状态
{
QMouseEvent *ev = static_cast<QMouseEvent *>(e); //类型转换,<>中是转换类型,()是被转换的内容
QString str = QString("Event鼠标按下 x=%1 y=%2 gx=%3 gy=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
return true; //返回true,自己处理不向下分发(代表拦截)
}
return QLabel::event(e); //其他事件交给父类,以默认方式处理
}
ui->label->installEventFilter(this); //给label控件安装事件过滤器
bool eventFilter(QObject *,QEvent *); //重写事件过滤器的事件
#include
#include
bool Widget::eventFilter(QObject *obj,QEvent *e) //二、重写eventFilter事件
{
if(obj == ui->label)
{
if(e->type() == QEvent::MouseButtonPress) //鼠标按下,在event中做拦截,e->type() == 鼠标状态
{
QMouseEvent *ev = static_cast<QMouseEvent *>(e); //类型转换,<>中是转换类型,()是被转换的内容
QString str = QString("事件过滤鼠标按下 x=%1 y=%2 gx=%3 gy=%4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
return true; //返回true,自己处理不向下分发(代表拦截)
}
}
return QWidget::eventFilter(obj,e); //默认处理
}
void paintEvent(QPaintEvent *); //绘图事件
#include //画笔类
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this); //实例画笔对象,this代表在当前窗口下
painter.drawLine(QPoint(0,0),QPoint(100,100)); //画线
QPen pen(QColor(255,0,0)); //设置画笔颜色-红色
pen.setWidth(3); //设置画笔宽度
pen.setStyle(Qt::DotLine); //设置画笔风格
painter.setPen(pen); //设置到画家手中
QBrush brush(Qt::green); //设置画刷-颜色绿色QColor(0,255,0)或Qt::green
brush.setStyle(Qt::DiagCrossPattern); //设置画刷风格-不设置 时默认填充
painter.setBrush(brush); //设置到画家手中
painter.drawEllipse(QPoint(100,100),100,50); //画圆,参数一:圆心、参数二:rx、参数三:ry
painter.drawRect(QRect(30,20,50,20));//画矩形,参数一:x、参数二:y、参数三:x长度、参数四:y长度
painter.drawText(QRect(10,200,150,50),"汉字"); //在矩形框中画字
}
painter.setRenderHint(QPainter::Antialiasing); //设置抗锯齿
painter.translate(100,0); //让画家移动位置,由0,0变为100,0
painter.save(); //保存画家位置
painter.restore(); //还原画家保存的位置
/**************************绘图高级设置************************************/
QPainter painter(this); //实例画笔对象,this代表在当前窗口下
// painter.drawEllipse(QPoint(100,100),50,50); //画圆
// painter.setRenderHint(QPainter::Antialiasing); //设置抗锯齿
// painter.drawEllipse(QPoint(200,100),50,50); //画圆
painter.drawRect(QRect(30,20,50,20)); //画矩形
painter.translate(100,0); //让画家移动位置,由0,0变为100,0
painter.save(); //保存画家位置
painter.drawRect(QRect(30,20,50,20)); //画矩形
painter.translate(100,0); //让画家移动位置,由0,0变为100,0
painter.restore(); //还原画家保存的位置
painter.drawRect(QRect(30,20,50,20)); //画矩形
/**************************手动调用绘图事件-通过资源文件画图片**************************/
QPainter painter(this); //实例画笔对象,this代表在当前窗口下
//(posX,posY,100,100,QPixmap(":/Picture/01.jpg")
//参数一:x 参数二:y 参数三:长 参数四:宽 参数五:图片路径(参数三四不要时默认画到图片大小)
painter.drawPixmap(posX,posY,100,100,QPixmap(":/Picture/01.jpg"));
int posX = 0;
int posY = 0;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->btn_x,&QPushButton::clicked,[=](){
posX+=20;
if(posX > this->width()) //超出屏幕宽度让其等于零
{
posX = 0;
}
update(); //手动调用绘图事件,用update更新
});
connect(ui->btn_y,&QPushButton::clicked,[=](){
posY+=20;
if(posY > this->height()) //超出屏幕高度让其等于零
{
posY = 0;
}
update(); //手动调用绘图事件,用update更新
});
}
#include
#include
QPixmap pix(300,300); //设置画布大小
pix.fill(Qt::white); //设置背景色-白色
QPainter painter(&pix); //生成画家
painter.setPen(QPen(Qt::green)); //设置画笔绿色
painter.drawEllipse(QPoint(100,100),50,50); //画圆
pix.save("D:\\pix.png"); //保存到指定路径
#include
#include
QImage img(300,300,QImage::Format_ARGB32); //设置画布大小-格式
img.fill(Qt::green); //设置背景色-绿色
QPainter painter(&img); //生成画家
painter.setPen(QPen(Qt::red)); //设置画笔红色
painter.drawEllipse(QPoint(100,100),50,50); //画圆
img.save("D:\\img.png"); //保存到指定路径
void paintEvent(QPaintEvent *);
Widget.cpp中进行实现(需要添加资源文件)
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
//利用QImage对像素进行修改
QImage img;
img.load(":/Picture/01.jpg");
for(int i=50;i<100;i++)
{
for(int j=50;j<100;j++)
{
QRgb value = qRgb(255,0,0); //设置value值为红色
img.setPixel(i,j,value); //i行,j列,红色像素点
}
}
painter.drawImage(0,0,img);
}
#include
//QPicture绘图设备 可以记录并重现绘图指令
QPicture pic;
QPainter painter; //设置画家
painter.begin(&pic); //开始在pic上绘画
painter.setPen(QPen(Qt::red)); //设置画笔红色
painter.drawEllipse(QPoint(100,100),50,50); //画圆
painter.end(); //结束绘画
pic.save("D:\\pic.tc"); //保存到指定路径-任意修改后缀名
可以在新建的函数中进行重绘
QPainter painter(this);
//重现QPicture绘图指令
QPicture pic;
pic.load("D:\\pic.tc");
painter.drawPicture(0,0,pic);
#include "widget.h"
#include "ui_widget.h"
#include
#include //曲线
#include //折线
#include
#include
#include
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QChart *chart = new QChart();
QValueAxis *valueAxisX = new QValueAxis();
QValueAxis *valueAxisY = new QValueAxis();
//设置范围
valueAxisX->setRange(0,5000);
valueAxisY->setRange(0,100);
//设置显示内容
valueAxisX->setTitleText("ms");
valueAxisY->setTitleText("m");
//设置标题整数%d,小数%f
valueAxisX->setLabelFormat("%d");
valueAxisY->setLabelFormat("%d");
valueAxisX->setTickCount(11);//设置X轴格子数量11根线10格
valueAxisY->setTickCount(11);
//添加图标坐标轴
chart->createDefaultAxes();
chart->addAxis(valueAxisX,Qt::AlignBottom);
chart->addAxis(valueAxisY,Qt::AlignLeft);
//设置图标的标题图例显示是否需要
chart->setTitle("温度与时间曲线");
chart->legend()->setVisible(false);
//创建曲线
QSplineSeries *splineSeries = new QSplineSeries();
splineSeries->append(0,50);//第一秒,50
splineSeries->append(1000,60);
splineSeries->append(2000,60);
splineSeries->append(3000,60);
splineSeries->append(4000,50);
splineSeries->append(5000,30);
splineSeries->append(6000,80);
QPen pen(QColor(0xff5566));
splineSeries->setPen(pen);
//图标添加曲线
chart->addSeries(splineSeries);
//将线的数据和坐标轴相连
splineSeries->attachAxis(valueAxisX);
splineSeries->attachAxis(valueAxisY);
//图标放到图标视图中
ui->chartView->setChart(chart);
QSplineSeries *series;
series = new QSplineSeries(this);
series->attachAxis(valueAxisX);
series->attachAxis(valueAxisY);
}
Widget::~Widget()
{
delete ui;
}
#include
#include
#include
//点击按钮,弹出打开文件对话框
connect(ui->btn,&QPushButton::clicked,[=](){
//打开文件对话框 参数1 父类,参数2 标题,参数3 路径,参数4 过滤文件格式--"(*.txt)"
QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\USER\\Desktop");
QTextCodec * codec = QTextCodec::codecForName("gbk"); //
ui->lineEdit->setText(path);//一、将路径放到lineEdit中,需要用QString定义path = 上述内容
QFile file(path); //读取路径 QFile默认utf-8格式
file.open(QIODevice::ReadOnly); //设置打开方式--只读
QByteArray array = file.readAll(); //设置读取所有内容--返回值array
/*
QByteArray array;
while (!file.atEnd())
{
array += file.readLine(); //按行读
}
*/
ui->textEdit->setText(codec->toUnicode(array)); //将array转码为codec中设置的格式(gbk)
file.close(); //关闭文件
//文件写入
file.open(QIODevice::Append); //设置打开方式--追加方式写不会影响文件原本的内容
file.write("aaaaaaaaaa");
file.close();
#include
#include
#include
//QFileInfo 文件信息类
QFileInfo info(path); //添加路径
qDebug() << "大小:" << info.size() << "后缀名:" << info.suffix() << "文件名称:" << info.fileName() << "文件路径:" << info.filePath();
qDebug() << "创建日期:" << info.created().toString("yyyy/MM//dd hh:mm:ss");
qDebug() << "最后修改日期:" << info.lastModified().toString("yyyy-MM-dd hh:mm:ss");