QT
文章目录
内容来自:b站最新QT从入门到实战完整版|传智教育。
一、按钮
1.效果
2.代码
#include<QPushButton>//头文件
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
//方法1
QPushButton *btn=new QPushButton;
//btn->show();//以顶层方式显示
btn->setParent(this);//在myWidget窗口中
btn->setText("按钮");//显示文本
//方法2
QPushButton * btn2=new QPushButton("按钮2",this);
btn2->move(100,100);//移动按钮
resize(600,400);//重置按钮
setWindowTitle("窗口");//设置窗口标题
setFixedSize(600,400);//设置窗口固定大小
//参数:信号发送者 发送的信号(函数的地址) 信号接收者 处理的槽函数(函数地址)
connect(btn,&QPushButton::clicked,this,&QWidget::close);
//功能:点击btn按钮关闭窗口
}
二、自定义信号和槽
1.自定义信号: 写在signals下,void,需要声明,不需要实现,可以有参数,可重载。
2.槽: 写在public下,void,需要声明,需要实现,可有参数,可发生重载。
3.断开信号: disconnect
4.emit: 使用emit关键字发送信号
5.示例关键代码如下:
1.widget.cpp
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::hu,st,&Student::treat);
//调用函数
// classIsOver();
//带参数
//函数指针-》函数地址
void(Teacher::*ts)(QString)=&Teacher::xk;
void(Student::*ss)(QString)=&Student::treat;
connect(zt,ts,st,ss);
classIsOver();
}
void Widget::classIsOver()
{
//触发信号
//emit zt->xk();
emit zt->xk("计算机作业");
}
2.widget.h
#include <QWidget>
#include"teacher.h"
#include"student.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
Teacher *zt;
Student *st;
void classIsOver();
};
3.student.cpp
#include "student.h"
#include<qdebug>
void Student::treat()
{
qDebug()<<"下课";
}
void Student::treat(QString foodName)
{
//显示布置“foodName的内容”
// qDebug()<<"布置"<<foodName;
qDebug()<<"布置"<<foodName.toUtf8().data();
//QString ->chat *:先转成QByteArray再转chat*,消“”
}
4.teacher.h和student.h
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定义信号,void,需要声明,不需要实现,可以有参数,可以重载
void xk();
void xk(QString foodName);
};
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
//槽函数:void,需要声明,需要实现,可有参数,可发生重载
void treat();
void treat(QString foodName);
signals:
};
6.效果图:
三、Lambda表达式
1.表达式
(1) [函数对象参数] (操作符重载函数参数) mutable->返回值{函数体}
(2) [] () {}()
2.函数对象参数
(1)空
(2)= : 值传递,所在作用范围内所有可见局部变量。
(3)&: 引用传递方式,所在作用范围内所有可见局部变量。
(4)this: 所在类中成员变量。
(5)a: 将a按值进行传递。
(6)&a: 将a按引用进行传递。
3.示例:
//将“下课”按钮-》"lambda"按钮
[=](){
btn->setText("lambda");
}();
//演示将(5)a按值传递
QPushButton *btn2=new QPushButton("a",this);
this->resize(600,400);
btn2->move(100,100);
[btn2](){
btn2->setText("lambda2");
//btn->setText("lambda");//’btn‘ is not captured
}();
//输出 ret=100
int ret=[]()->int{return 100;}();
qDebug()<<"ret="<<ret;
//利用lambda表达式,实现点击按钮,关闭窗口
QPushButton *btn3=new QPushButton;
btn3->setText("关闭");
btn3->move(100,0);
btn3->setParent(this);
connect(btn3,&QPushButton::clicked,this,[=](){
this->close();
emit zt->xk("计算机");
});
//结果:点击”关闭“按钮,窗口关闭并输出(布置 计算机)
四、QMainWindow
1.菜单栏
(1)效果:
(2)代码:
#include "mainwindow.h"
#include<QMenuBar>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
resize(600,400);
//创建菜单栏(最多只能有一个)
QMenuBar *bar=menuBar();
setMenuBar(bar);//将菜单栏放入窗口中
//创建菜单
QMenu *fMenu=bar->addMenu("文件");
QMenu *eMenu=bar->addMenu("编辑");
//创建菜单项(在菜单“文件”下)
fMenu->addAction("新建");
fMenu->addSeparator();//添加分割线
fMenu->addAction("打开");
}
2.工具栏
(1)效果:
(2)代码:
#include "mainwindow.h"
#include<QMenuBar>
#include<QToolBar>
#include<QDebug>
#include<QPushButton>
//工具栏(可以有多个)
QToolBar *tBar=new QToolBar(this);
//将工具栏放在窗口中的左边(Qt::LeftToolBarArea)
addToolBar(Qt::LeftToolBarArea,tBar);
//设置只允许左右停靠(默认在窗口中,工具栏可移动到四周停靠)
tBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
//设置不允许浮动
tBar->setFloatable(false);
//设置不能移动(总开关)
tBar->setMovable(false);
//设置内容:1.与菜单栏写法一样
tBar->addAction("新建");
tBar->addSeparator();
tBar->addAction("打开");
//2.和上面菜单公用的写法
//QAction *newAction=fMenu->addAction("新建");
//QAction *openAction=fMenu->addAction("打开");
//tBar->addAction(newAction);
//tBar->addAction(openAction);
//添加控件
QPushButton *btn=new QPushButton("按钮",this);
tBar->addWidget(btn);//将按钮放入工具栏中
3.状态栏
(1)效果:
(2)代码:
#include<QStatusBar>
#include<QLabel>
#include<QDockWidget>
#include<QTextEdit>
//状态栏(最多一个)
QStatusBar *sBar=statusBar();
setStatusBar(sBar);//放入窗口中
//标签控件
QLabel *label=new QLabel("提示信息",this);
sBar->addWidget(label);
QLabel *label2=new QLabel("提示信息(右)",this);
sBar->addPermanentWidget(label2);//在右侧加入提示信息
//铆接部件(浮动窗口) 可以有多个
QDockWidget *dw=new QDockWidget("浮动窗口",this);
addDockWidget(Qt::BottomDockWidgetArea,dw);//位于核心/中心的下边
//设置浮动窗口只允许上下停靠
dw->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
//设置中心部件(只能有一个)
QTextEdit *edit=new QTextEdit(this);
setCentralWidget(edit);
五、界面文件
1.添加图标
1.前操作:
首先点击界面文件中XXX.ui进行界面设计,设计如下:
tips:工具栏添加首先只能为英文,需要在右下角框中、text后修改为中文。
2.图标添加:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ui->actionnew->setIcon(QIcon("D:/Image/a"));//添加图标
//使用添加Qt资源
//1.复制需要的文件-》点击项目(.cpp)右键-》在Explorer中显示-》粘贴
//2.在Qt项目(总项目)中右键-》添加新文件-》Qt.Qt Resource File-》编辑信息并生产资源文件
//3.点击资源文件下的XXX.qrc的右键-》Open in Editor-》添加前缀(前缀:/ 或其他)-》添加文件(选种图片后点击打开)
//4.编译后可出现名为/的文件(图片在里面)
ui->actionnew->setIcon(QIcon(":/Image/a"));//格式为":+前缀名+文件名"
ui->actionopen->setIcon(QIcon(":/Image/b"));
}
MainWindow::~MainWindow()
{
delete ui;
}
3.效果图:
六、对话框
1.模态和非模态对话框
(1)效果:
(2)代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击新建按钮,弹出一个对话框
connect(ui->actionnew,&QAction::triggered,[=](){
//模态对话框(不可以对其他窗口操作,具有阻塞功能)
// QDialog dlg(this);
// dlg.resize(200,100);
// dlg.exec();
// qDebug()<<"模态对话框阻塞功能测试";
//非模态对话框(可以对其他窗口操作)
QDialog *dlg2=new QDialog(this);//防止窗口一闪而过
dlg2->resize(200,100);
dlg2->show();
dlg2->setAttribute(Qt::WA_DeleteOnClose);//防止内存泄漏
});
}
MainWindow::~MainWindow()
{
delete ui;
}
2.消息对话框
(1)提问对话框效果:
(2)代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDialog>
#include<QDebug>
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击新建按钮,弹出一个对话框
connect(ui->actionnew,&QAction::triggered,[=](){
//消息对话框
//QMessageBox 静态成员函数
//参数:父亲 标题 提示内容 按键类型 默认关联回车按键
//1.错误对话框(框名为critical,内容为叉图标和错误文字)
//QMessageBox::critical(this,"critical","错误");
//2.信息对话框
//QMessageBox::information(this,"info","信息");
//3.提问对话框
//QMessageBox::question(this,"ques","提问");//(默认显示Yes和No按钮)
//显示Save和Cancel按钮,设置默认回车按键为Cancel
//返回值 也是StandardButton类型,利用返回值判断用户的输入
if(QMessageBox::Save ==QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
qDebug()<<"选择的是保存";
}
else
{
qDebug()<<"选择的是取消";
}
//4.警告对话框
// QMessageBox::warning(this,"warning","警告");
});
}
3.其他
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDialog>
#include<QDebug>
#include<QMessageBox>
#include<QColorDialog>
#include<QFileDialog>
#include<QFontDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击新建按钮,弹出一个对话框
connect(ui->actionnew,&QAction::triggered,[=](){
//其他对话框
//1.颜色对话框 QColor(r,g,b,透明度)
//返回值为颜色数值
// QColor col= QColorDialog::getColor(QColor(135,209,255));
// qDebug()<<"r="<<col.red()<<",g="<<col.green()<<",b"<<col.blue();
//2.文件对话框 参数:父亲 标题 默认打开路径 过滤文件格式
//点击新建,自动打开桌面显示过滤后的txt和文件夹
//返回值为 选取的路径
// QString str= QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\佳\\Desktop","(*.txt)");
// qDebug()<<str;
//3.字体对话框
bool f;
QFont font=QFontDialog::getFont(&f,QFont("宋体",36));
qDebug()<<"字体:"<<font.family().toUtf8().data()<<",字号:"<<font.pointSize()<<",是否加粗:"<<font.bold()<<",是否倾斜:"<<font.italic();
});
}
//QInputDialog :允许用户输入一个值,并将其值返回
//QMessageBox :模态对话框
//QPageSetupDialog :为打印机提供纸张相关的选项
//QPrintDialog :打印机配置
//QPrintPreviewDialog :打印预览
//QProgressDialog :显示操作过程
七、ui界面
1.按钮组
(1)QPushButton : 常用按钮
(2)QToolButton: 工具按钮可,用于显示图片
(3)radioButton: 单选按钮
(4)checkbox: 多选按钮,可监听状态
1.界面图:
2.有关代码:
#include "widget.h"
#include "ui_widget.h"
#include<QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//1.设置单选按钮,默认男
//自定义按钮名:rBtnMan
ui->rBtnMan->setChecked(true);
//选中"女"后,打印信息
connect(ui->rBtnWoman,&QRadioButton::clicked,[=](){
qDebug()<<"性别:女";
});
//2.多选按钮
//自定义按钮名:cBa
//输出:2(选中) 0(未选中)
//1:半选(需要在属性的tristate打勾)
connect(ui->cBa,&QCheckBox::stateChanged,[=](int state){
qDebug()<<state;
});
}
Widget::~Widget()
{
delete ui;
}
八、控件
1.QListWidget控件
(1)效果图:
(2)代码:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//利用listWidget写诗
//法1:
QListWidgetItem *item=new QListWidgetItem("长风破浪会有时");
//将一行诗放入到listWidget控件中
ui->listWidget->addItem(item);
item->setTextAlignment(Qt::AlignHCenter);//设置水平居中
//法2:(缺点:无法设置居中)
//QStringList QList<QString>
QStringList list;
list<<"长风破浪会有时"<<"直挂云帆济沧海";
ui->listWidget->addItems(list);
}
2.QTreeWidget树控件
(1)效果图:
(2)代码:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//treeWidget树控件使用
//1.设置水平头
ui->treeWidget->setHeaderLabels(QStringList()<<"诗人"<<"诗人介绍");
//2.创建根节点
QTreeWidgetItem *titem =new QTreeWidgetItem(QStringList()<<"唐");
QTreeWidgetItem *djitem =new QTreeWidgetItem(QStringList()<<"东晋");
QTreeWidgetItem *sitem =new QTreeWidgetItem(QStringList()<<"宋");
//3.加载顶层的节点(添加根节点到树控件上)
ui->treeWidget->addTopLevelItem(titem);
ui->treeWidget->addTopLevelItem(djitem);
ui->treeWidget->addTopLevelItem(sitem);
//4.追加子节点
QStringList poet1;
poet1<<"李白"<<"字太白,号青莲居士,诗仙";
QTreeWidgetItem *l1=new QTreeWidgetItem(poet1);
titem->addChild(l1);
}
3.QTableWidget控件
(1)效果图:
(2)代码:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置列数
ui->tableWidget->setColumnCount(3);
//设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
//设置行数
ui->tableWidget->setRowCount(5);
//设置正文
//1.设置某个单元格
//ui->tableWidget->setItem(0,0, new QTableWidgetItem("李白"));
//2.整体设置
QStringList nameList;
nameList<<"李白"<<"杜甫"<<"陶渊明"<<"李贺"<<"李清照";
QList<QString> sexList;//等于QStringList
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(1和2可互用)
//int转QString:QString::number(18)
ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18)));
}
}
4.其他
(1)栈控件效果图:
(2)代码:
#include "widget.h"
#include "ui_widget.h"
#include<QMovie>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//1.栈控件使用
//设置默认定位scrollArea
ui->stackedWidget->setCurrentIndex(0);
//scrollArea按钮
connect(ui->btn_scroll,&QPushButton::clicked,[=](){
//CurrentIndex可在ui设计界面查看
ui->stackedWidget->setCurrentIndex(0);
});
//toolBox按钮
connect(ui->btn_tool,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(2);
});
//TabWidget按钮
connect(ui->btn_tab,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(1);
});
//2/下拉框
ui->comboBox->addItem("滑板");
ui->comboBox->addItem("自行车");
ui->comboBox->addItem("小电驴");
//点击按钮 选择自行车选项
connect(ui->btn_select,&QPushButton::clicked,[=](){
//法1:
//ui->comboBox->setCurrentIndex(1);
//法2:
ui->comboBox->setCurrentText("自行车");
});
// //利用Qlable显示图片
// ui->lbl_Image->setPixmap(QPixmap(":/Image/a.png"));
// //利用Qlabel显示gif动态图片
// QMovie *movie =new QMovie(":/XX.gif");
// ui->lbl_movie->setMovie(movie);
// movie->start();//播放
}
5.自定义控件封装
(1)效果图:
(2)代码:
//1.头文件smallwidget.h声明
public:
explicit SmallWidget(QWidget *parent = nullptr);
~SmallWidget();
//设置数字
void setNum(int num);
//获取数字
int getNum();
//2.samllwidget.cpp实现函数
SmallWidget::SmallWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SmallWidget)
{
ui->setupUi(this);
//QSpinBox移动 QSlider跟着动
void(QSpinBox::* spSignal)(int)=&QSpinBox::valueChanged;
connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);
//QSlider
connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
}
//设置数字
void SmallWidget::setNum(int num)
{
ui->spinBox->setValue(num);
}
//获取数字
int SmallWidget::getNum()
{
return ui->spinBox->value();
}
//3.widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击获取 获取当前控件的值
connect(ui->btn_get,&QPushButton::clicked,[=](){
qDebug()<<ui->widget->getNum();
});
connect(ui->btn_set,&QPushButton::clicked,[=](){
ui->widget->setNum(50);
});
}
(3)步骤:
1.添加新文件—》QT—》设计师界面类。
2. .ui中设计QSpinBox和QSlider两个控件。
3. Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提交。
九、事件
1.鼠标事件
(1)效果图:
(2)代码:
//1.mylabel.h
public:
explicit myLabel(QWidget *parent = nullptr);
//鼠标进入事件
void enterEvent(QEvent *event);
//鼠标离开事件
void leaveEvent(QEvent *);
//鼠标按下
virtual void mousePressEvent(QMouseEvent *ev);
//鼠标释放
virtual void mouseReleaseEvent(QMouseEvent *ev);
//鼠标移动
virtual void mouseMoveEvent(QMouseEvent *ev);
//2.mylabel.cpp
myLabel::myLabel(QWidget *parent)
: QLabel{parent}
{
//设置鼠标追踪,默认false
//没设置前,鼠标悬停移动不会触发下面移动事件
//设置后,只要鼠标移动,就会触发移动事件
//setMouseTracking(true);
}
//鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{
//qDebug()<<"鼠标进入事件";
}
//鼠标离开事件
void myLabel::leaveEvent(QEvent *)
{
//qDebug()<<"鼠标离开事件";
}
//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev)
{
//当鼠标左键按下,提示位置信息
//%1:第一个arg(),%2:第二个arg(),以此类推
//这种类似%d、%s,但是不需要区分类型,更简单
//x,y基于Label框的位置,global基于屏幕
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()<<"鼠标释放";
}
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
//button()可以判断所有按键
//buttons()判断组合按键,结合&操作符
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;
}
}
2.定时器
(1)效果图:
(2)代码:
//widget.h
public:
Widget(QWidget *parent = nullptr);
~Widget();
//重写定时器事件
void timerEvent(QTimerEvent *);
//定时器的唯一标识
int id1;//定时器1
int id2;//定时器2
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QTimer>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//启动定时器
//定时器1(方法一)
//参数1:间隔(毫秒)
//返回值为定时器的唯一标识
id1=startTimer(1000);//每隔1s
id2=startTimer(2000);//每隔2s
//定时器2(方法二)
QTimer *timer=new QTimer(this);
//启动定时器
timer->start(500);//每隔0.5s
connect(timer,&QTimer::timeout,[=](){
static int num3=1;
ui->label_4->setText(QString::number(num3++));
});
//利用按钮,实现暂停定时器
connect(ui->btn,&QPushButton::clicked,[=](){
timer->stop();
});
}
void Widget::timerEvent(QTimerEvent *ev)
{
//定时器1.1:每隔1s+1
if(ev->timerId()==id1)
{
static int num=1;
ui->label_2->setText(QString::number(num++));
}
//定时器1.2:每隔2s+1
if(ev->timerId()==id2)
{
static int num2=1;
ui->label_3->setText(QString::number(num2++));
}
}
Widget::~Widget()
{
delete ui;
}
(3)总结:
1.利用事件void timerEvent(QTimerEvent *ev)
启动:startTimer();
2.利用定时器类 QTimer *timer=new QTimer(this)
启动:timer->start();
暂停:timer->stop();
3.event事件
(1)效果图:
(2)代码:
//mylabel.cpp
bool myLabel::event(QEvent *e){
//如果鼠标按下,在event事件分发中做拦截操作
//e->type()==鼠标按下
if(e->type()==QEvent::MouseButtonPress)
{
QMouseEvent *ev=static_cast<QMouseEvent *>(e);
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);
}
4.事件过滤器
(1)效果图:
(2)代码:
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QTimer>
#include<QMouseEvent>
#include<QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//启动定时器
//定时器1(方法一)
//参数1:间隔(毫秒)
id1=startTimer(1000);//每隔1s
id2=startTimer(2000);//每隔2s
//定时器2(方法二)
QTimer *timer=new QTimer(this);
//启动定时器
timer->start(500);//每隔0.5s
connect(timer,&QTimer::timeout,[=](){
static int num3=1;
ui->label_4->setText(QString::number(num3++));
});
//利用按钮,实现暂停定时器
connect(ui->btn,&QPushButton::clicked,[=](){
timer->stop();
});
//给label1安装事件过滤器
//1.安装
ui->label->installEventFilter(this);
}
//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;
}
}
return QWidget::eventFilter(obj,e);
}
十、绘图
1.绘图事件
(1)效果图:
(2)代码:
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
void Widget::paintEvent(QPaintEvent *)
{
//实例化画家对象 this指定的是绘图设备
QPainter painter(this);
//设置画笔颜色
QPen pen(QColor(255,0,0));
//设置宽度
pen.setWidth(2);
//设置画笔风格(默认实线,Qt::DotLine虚线)
pen.setStyle(Qt::DotLine);
//使用
painter.setPen(pen);
//画刷(图片填充颜色)
//QBrush brush(Qt::blue);
QBrush brush(Qt::cyan);
brush.setStyle(Qt::Dense7Pattern);
painter.setBrush(brush);
//画线:参数(起点,终点)
painter.drawLine(QPoint(0,0),QPoint(100,100));
//画圆:参数(圆心,rx,ry)
painter.drawEllipse(QPoint(100,100),50,50);
//画矩形:参数(x,y,宽,高)
painter.drawRect(QRect(20,20,50,50));
//画文字
painter.drawText(QRect(10,200,100,100),"加油");
}
Widget::~Widget()
{
delete ui;
}
2.绘图高级事件
(1)效果图:
(2)代码:
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter pa(this);
// pa.drawEllipse(QPoint(100,50),50,50);
// //设置抗锯齿能力:绘画更精美,但效率较低
// pa.setRenderHint(QPainter::Antialiasing);
// pa.drawEllipse(QPoint(200,50),50,50);
pa.drawRect(QRect(20,20,50,50));
//移动绘画起笔位置
pa.translate(100,0);
pa.save();//保存状态
pa.drawRect(QRect(20,20,50,50));
pa.translate(100,0);
pa.restore();//还原状态:导致第二和第三个矩形重合
pa.drawRect(QRect(20,20,50,50));
}
Widget::~Widget()
{
delete ui;
}
3.绘图设备
#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QPicture>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/* //1.Pixmap绘图设备:专门为平台做了显示的优化
QPixmap pix(300,300);
//填充颜色
pix.fill(Qt::white);
QPainter pa(&pix);
pa.setPen(QPen(Qt::green));
pa.drawEllipse(QPoint(150,150),100,100);
//pix.save("路径");//保存
*/
/* //2.QImage 绘图设备:可以对像素进行访问
QImage img(300,300,QImage::Format_RGB32);
img.fill(Qt::white);
QPainter pa(&img);
pa.setPen(QPen(Qt::blue));
pa.drawEllipse(QPoint(150,150),100,100);
img.save("路径");
*/
//3.QPicture 绘图设备 可以记录和重现绘图指令
QPicture pic;
QPainter pa;
pa.begin(&pic); //开始往pic上画
pa.setPen(QPen(Qt::cyan));
pa.drawEllipse(QPoint(150,150),100,100);
pa.end();
pic.save("路径");
}
void Widget::paintEngine(QPaintEvent *)
{
/*
QPainter pa(this);
//利用QImag 对像素进行修改
QImage img;
img.load(":/Image/a.jpeg");
//修改像素点
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);
}
}
pa.drawImage(0,0,img);
*/
QPainter pa(this);
//重现绘图指令
QPicture pic;
pic.load("路径");
pa.drawPicture(0,0,pic);
}
Widget::~Widget()
{
delete ui;
}
十一、文件
1.文件读写操作
(1)效果图:
(2)代码:
#include "widget.h"
#include "ui_widget.h"
#include<QFileDialog>
#include<QFile>
#include<QTextCodec>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击选取文件按钮,弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString path=QFileDialog::getOpenFileName(this,"打开文件","D:\\qtfile");
//将路径放入到lineEdit中
ui->lineEdit->setText(path);
//编码格式类:假设要读取的文件为gbk模式
QTextCodec *codec=QTextCodec::codecForName("gbk");
//读取内容,放入到textEdit值
//QFile默认支持格式是utf-8
QFile file(path);
//设置打开方式
file.open(QIODevice::ReadOnly);
QByteArray arr=file.readAll();
/* //使用readLine读取全部
QByteArray arr;
while(!file.atEnd())
{
arr+=file.readLine();//按行读
}
*/
//将读取到的数据放入到textEdit中
ui->textEdit->setText(arr);
//ui->textEdit->setText(codec->toUnicode(arr));
//对文件对象进行关闭
file.close();
//对文件进行写操作
file.open(QIODevice::Append);//追加方式
file.write("good");
file.close();
});
}
Widget::~Widget()
{
delete ui;
}
2.文件信息读取
(1)效果图:
(2)代码:
#include "widget.h"
#include "ui_widget.h"
#include<QFileDialog>
#include<QFile>
#include<QTextCodec>
#include<QFileInfo>
#include<QDebug>
#include<QDateTime>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击选取文件按钮,弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString path=QFileDialog::getOpenFileName(this,"打开文件","D:\\qtfile");
//将路径放入到lineEdit中
ui->lineEdit->setText(path);
//编码格式类:假设要读取的文件为gbk模式
QTextCodec *codec=QTextCodec::codecForName("gbk");
//读取内容,放入到textEdit值
//QFile默认支持格式是utf-8
QFile file(path);
//设置打开方式
file.open(QIODevice::ReadOnly);
QByteArray arr=file.readAll();
/* //使用readLine读取全部
QByteArray arr;
while(!file.atEnd())
{
arr+=file.readLine();//按行读
}
*/
//将读取到的数据放入到textEdit中
ui->textEdit->setText(arr);
//ui->textEdit->setText(codec->toUnicode(arr));
//对文件对象进行关闭
file.close();
//对文件进行写操作
/* file.open(QIODevice::Append);//追加方式
file.write("good");
file.close();
*/
//文件信息类
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");
});
}
注
内容来自:b站最新QT从入门到实战完整版|传智教育。
如有错误,欢迎指出。