QT学习笔记

本文详细介绍了QT编程中的几个关键概念,包括如何创建和操作按钮,自定义信号和槽的使用,以及Lambda表达式的应用。此外,还讲解了QMainWindow的菜单栏、工具栏和状态栏的构建。内容还包括文件读写、对话框创建、界面设计以及事件处理等,为QT初学者提供了全面的入门教程。
摘要由CSDN通过智能技术生成

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从入门到实战完整版|传智教育。
如有错误,欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值