QT-学习笔记


QT-学习笔记


前言

例如:


QT-day01

一、创建第一个QT程序

  1. 创建名称不能有中文不能有空格
  2. 创建路径不能有中文
  3. 默认创建有窗口类–Widget,基本有三种:Qwidget(空窗口)、QMainWindow(带控件窗口)、QDialog

二、基本知识

1.命名规范&快捷键

/*********************************************
命名规范
类名, 首字母大写,单词和单词之间首字母大写
函数名 变量名称 ,首字母可以小写,单词和单词之间首字母大写

快捷键
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
查找 ctrl + f
整行移动 ctrl + ↑↓
帮助文档 F1
自动对齐 ctrl + i
同名之间.h和.cpp切换 F4
**********************************************/

2.main函数

  1. QApplication a; 应用程序对象,在QT中有且只有一个
  2. Widget w; 实例化窗口对象
  3. w.show(); 调用show函数 显示窗口
  4. return a.exec(); 让应用程序对象进入消息循环机制中,代码阻塞到当前行

3.按钮控件常用API

  1. 创建QPushButton * btn =new QPushButton
  2. 设置父类 setParent(this);
  3. 设置文本 setText(“文字”);
  4. 设置位置 move(600,400);
  5. 重新制定窗口大小 resize(600,400);
  6. 设置窗口标题 setWindowTitle(“标题-运行”);
  7. 设置窗口固定大小 setFixedSize(600,400);
  8. 重新制定按钮大小 btn->resize(80,40);

三、函数

1.main函数

->代码如下(示例):

#include "widget.h"

#include <QApplication>     //包含一个应用程序的类的头文件
//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();    //让应用程序对象进入消息循环,后续代码不执行
}

2.widget窗口函数

代码如下(示例):

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>  //按钮控件的头文件
/*********************************************
命名规范
类名, 首字母大写,单词和单词之间首字母大写
函数名 变量名称 ,首字母可以小写,单词和单词之间首字母大写

快捷键
注释 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;
}

QT-day02

一、对象树

  1. 构造过程从上到下,析构过程从下到上。创建的子对象会被添加到父对象中,父对象关闭对应子对象也会关闭,父对象创建对应子对象也会创建
  2. 当创建的对象在堆区的时候,如果指定的父类是QObject派生的类或QObject子类派生的类,可以不用管理释放操作;对象会被放在对象树中,一起构造或析构。
  3. 可以自己删除子对象,但在QT中尽量在构造时指定parent对象,这样就可以任意创建不用担心释放问题,一定程度上简化了内存回收机制。

二、QT窗口坐标系

  1. 坐标系以左上角为原点(0,0),X向右增加,Y向下增加;
  2. 对于嵌套窗口,其坐标是相对于父类窗口来说的。

三、信号和槽机制

1.connect函数(连接)

  1. connect(信号发送者,发送的具体信号,信号接受者,信号处理(槽))
  2. 信号槽之间为松散耦合,信号发送端和信号接收端本身没有关联,通过connect连接将两端耦合在一起

2.Signals函数(信号)

void clicked(bool checked = false)	//点击
void pressed()		//按下
void released()		//释放
void toggled(bool checked)		//切换,开或关 

3.Slots函数(槽)

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()

4.点击按钮关闭窗口

代码如下(示例):

/*****参数1 信号发送者,参数2 发送的信号(函数的地址),参数3 信号的接收者,参数4 处理的槽函数**********/
//    connect(myBtn, &MyPushButton::clicked,this,&Widget::close);
    connect(myBtn, &QPushButton::clicked,this,&QWidget::close);     //函数地址可以直接写父类

5.自定义信号和槽

  1. 信号可以连接信号;一个信号可以连接多个槽;多个信号可以连接一个槽;信号和槽参数必须一一对应,信号参数个数大于或等于槽参数个数
  2. 自定义信号:
    写到signals下,返回void,需要声明,不需要实现,可以有参数,可以重载
    Teacher.h声明代码如下(示例):
class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
/*
自定义信号写到signals下面
返回值是void,只需要声明,不需要实现
可以有参数,可以重载
*/
    void hungry();
};
  1. 自定义槽:
    写到public下,返回void,需要声明,需要实现,可以有参数,可以重载
    Student.h声明代码如下(示例):
class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);
/*
返回值是void,需要声明,需要实现
可以有参数,可以重载
*/
    void treat();

signals:

};

Student.cpp实现代码如下(示例):

void Student::treat()
{
   qDebug()<<"请老师吃饭";
}
  1. 主函数
    widget.c代码如下(示例):
#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;
}

6.自定义信号和槽的重载

  1. 需要利用函数指针明确的指向函数地址
    //连接  有参数
    //函数指针->函数地址
    void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
    void(Student:: *studentSlot)(QString) = &Student::treat;
    connect(zt,teacherSignal,st,studentSlot);
  1. QString转成char * 要先用.toUtf8()转QByteArray再用.data()转char *
//    qDebug() << "请老师吃饭,老师要吃" << foodName;
    //QString->char * 就不会打印出""号,要先用.toUtf8()转QByteArray再.data()转char *
    qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
  1. Student.h声明函数
class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);
/*
返回值是void,需要声明,需要实现
可以有参数,可以重载
*/
    void treat();

    void treat(QString foodName);   //重载,需要在.cpp中实现

signals:

};
  1. Student.cpp实现函数
void Student::treat(QString foodName)
{

//    qDebug() << "请老师吃饭,老师要吃" << foodName;
    //QString->char * 就不会打印出""号,要先用.toUtf8()转QByteArray再.data()转char *
    qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
}
  1. Teacher.h声明函数
lass Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);

signals:
/*
自定义信号写到signals下面
返回值是void,只需要声明,不需要实现
可以有参数,可以重载
*/
    void hungry();
    void hungry(QString foodName);  //重载
};
  1. widget.cpp函数
#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;
}

7.自定义信号和槽的重载增加按钮

  1. 信号连接槽
    //点击一个按钮,再触发下课
    QPushButton * btn = new QPushButton("下课",this);
    this->resize(600,400);  //重置窗口大小

    //点击按钮触发下课,信号触发槽函数
    connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
  1. 信号连接信号
    //无参信号和槽连接,点击按钮触发下课,信号触发信号
    void(Teacher:: *teacherSignal2)(void) = &Teacher::hungry;
    void(Student:: *studentSlot2)(void) = &Student::treat;
    connect(zt,teacherSignal2,st,studentSlot2);

    connect(btn,&QPushButton::clicked,zt,teacherSignal2);//点击按钮触发下课,信号触发信号
  1. 断开信号
    //无参信号和槽连接,点击按钮触发下课,信号触发信号
    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);	//引用哪个断开哪个

四、Lambda表达式

1.表达式基本构成

//[](){}是函数声明,后面加()是函数调用,调用之后才能使用,[函数对象参数](操作符重载函数参数)mutable->返回值{函数体}
    [=]()
    {
        btn->setText("上课");
    }();
  1. [函数对象参数](操作符重载函数参数)mutable->返回值{函数体}
  2. [] 标识一个Lambda的开始,必须存在,不能省略,里面可以添加以下内容:
    “=” 函数体内可以使用Lambda所在范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递
    “&” 函数体内可以使用Lambda所在范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递
//[](){}是函数声明,后面加()是函数调用,调用之后才能使用
    [=]()
    {
        btn->setText("上课");
    }();
  1. ()参数
  2. {} 实现体
  3. mutable 修饰值传递的变量,只是拷贝,不修改值本身
    QPushButton * btn1 = new QPushButton;
    int m = 10;
    connect(btn1,&QPushButton::clicked,this,[m]()mutable{m = 100 + 10; qDebug()<<m;});
    qDebug()<<m;
  1. 返回值 [ ] () -> {}

2.Lambda表达式的使用

    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
    });

在这里插入图片描述

QT-day03

一、QMainWindow的使用

1.菜单栏

#include <QMenuBar>
    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("下一步");  //“编辑”中创建一个“下一步”

2.工具栏

#include <QToolBar>
#include <QtDebug>  //添加该头文件可以使用打印功能
#include <QPushButton>
/*****************创建工具栏,可以有多个****************************/
    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);    //把按钮放到工具栏中

3.状态栏

#include <QStatusBar>
#include <QLabel>
/*****************创建状态栏,最多只有一个***************************************************************************************/

    QStatusBar * stBar = statusBar();   //创建状态栏
    setStatusBar(stBar);    //设置到窗口中
    QLabel * label = new QLabel("提示信息",this);
    stBar->addWidget(label);    //放到标签栏中-左侧
    QLabel * label2 = new QLabel("右提示信息",this);
    stBar->addPermanentWidget(label2);    //放到标签栏中-右侧

4.铆接部件和中心部件

#include <QDockWidget>
#include <QTextEdit>
/*****************铆接部件,可以有多个***************************************************************************************/

    QDockWidget * dockWidget = new QDockWidget("浮动",this);
    addDockWidget(Qt::BottomDockWidgetArea,dockWidget); //Qt::BottomDockWidgetArea-放到下面

/*****************设置中心部件,只能有一个***************************************************************************************/

    QTextEdit * edit = new QTextEdit(this);
    setCentralWidget(edit); //设置为中心部件 

二、添加资源文件

  1. 将图片文件夹拷贝到项目文件下
  2. 右键项目->添加新文件->QT->QT recourse File
  3. 给资源文件起名 例:res会生成res.qrc
  4. 编译资源
  5. 添加前缀->添加文件
  6. 使用":+前缀名+文件名"
//    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"));

QT-day04

一、对话框

1.分类:模态对话框(不可以对其他窗口操作)、非模态对话框(可以对其他窗口操作)

#include <QDialog>
//        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();     //非模态对话框

二、标准对话框

1.标准对话框–消息对话框QMessageBox

  1. 消息对话框:模态对话框,用于显示信息,询问问题等
  2. 参数1 父类,参数2 标题,参数3 提示内容,参数4 按键类型,参数5 默认回车按键关联对象
#include <QMessageBox>
#include <QDebug>
//        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() << "选择取消";
        }

2.标准对话框–颜色对话框QColorDialog

#include <QColorDialog>
//        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();

3.标准对话框–打开文件对话框QFileDialog

#include <QFileDialog>
//打开文件对话框 参数1 父类,参数2 标题,参数3 路径,参数4 过滤文件格式
//        QFileDialog::getOpenFileName(this,"打开文件","C:/Users/USER/Desktop","(*.txt)");//不打印返回值

        QString str = QFileDialog::getOpenFileName(this,"打开文件","C:/Users/USER/Desktop","(*.txt)");
        qDebug() << str;//打印返回值 是打开文件的路径

4.标准对话框–字体对话框QFontDialog

#include <QFontDialog>
//字体对话框font.family()打印之后带引号,加上.toUtf8().data()之后不带
        bool flag;
        QFont font = QFontDialog::getFont(&flag,QFont("仿宋",36));
        qDebug() << "字体:" << font.family().toUtf8().data() << "字号" << font.pointSize() << "是否加粗" << font.bold() << "是否倾斜" << font.italic();

三、布局

1.登录界面

2.QPushButton(常用按钮)

3.QToolButton(工具按钮、用于显示图片、文字)

  1. 修改toolButtonStyle为toolButtonTextBesidelcon可以图片文字一起显示
  2. 修改autoRaise(打钩)可以显示鼠标放上按钮凸起

4.radioButton(单选按钮)

  1. 设置默认
    ui->rBtnMan->setChecked(true);//设置单选按钮,男默认选中(先在UI中改名)
    connect(ui->rBtnWoman,&QRadioButton::clicked,[=](){
       qDebug() << "选中女";//选中女 进行打印

5.checkBox(多选按钮)

  1. 监听状态(选中tristate有半选功能)
    connect(ui->cBox,&QCheckBox::stateChanged,[=](int state){
    qDebug() << state;//打印0、2,在UI中选中tristate后变为0、1、2其中0未选,1半选,2选中

6.QListWidget(列表容器)

  1. 单行写(可以居中操作)
#include <QListWidgetItem>
/******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);//右下
  1. 多行写(不可以居中操作)
/******无法做水平居中*******************/
    QStringList list;
    list << "第一句" << "第二句" << "第三句" << "第四句";
    ui->listWidget->addItems(list);

7.QTreeWidget(树控件)

  1. 单独一个目录及子目录
/****************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);           //添加子节点到力量目录下
  1. 多个根目录及子目录
/********************创建目录***************************************************/
    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);           //添加子节点到智力目录下

8.QTableWidget()

/************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
    }

9.其他常用控件(需要先在UI界面设置对应控件)

  1. 栈控件使用
/******************************栈控件使用*************************************/
    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)页面标识
  1. 下拉窗控件使用
/******************************下拉窗控件使用*************************************/
    ui->comboBox->addItem("第一个");
    ui->comboBox->addItem("第二个");
    ui->comboBox->addItem("第三个");

//
    connect(ui->btn_select,&QPushButton::clicked,[=](){
        ui->comboBox->setCurrentIndex(2);   //方法一:选中第2号中的内容
//        ui->comboBox->setCurrentText("第三个");    //方法二:直接显示内容
    });
  1. 利用QLabel显示图片和动图
#include <QMovie>	//.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();     //开始 播放

10.自定义控件

  1. Spin Box和Horizontal Slider控件组合
/*********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);
  1. Spin Box和Horizontal Slider控件组合(加按钮控制实现获取当前值和设置到一半值)
#include <QDebug>

在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);
    });

QT-day05

一、鼠标事件(QEvent)

1.实现鼠标移动监听

  1. 添加新的.h和.cpp文件并分别进行声明和实现函数的编写
    myLabel.h文件
    void enterEvent(QEvent * event);    //鼠标进入-声明
    void leaveEvent(QEvent * );     //鼠标离开-声明

myLabel.cpp文件

void myLabel::enterEvent(QEvent * event)    //鼠标进入-实现,myLabel::是该函数作用域
{
    qDebug() << "鼠标进入";
}

void myLabel::leaveEvent(QEvent * )     //鼠标离开-实现
{
    qDebug() << "鼠标离开";
}

2.实现鼠标点击监听,并区分左右中间按键

  1. 鼠标移动是实时变量,需要添加setMouseTracking(true);设置鼠标追踪状态,且不能用if判断需要改为&判断(移动函数中隐去的部分),或者直接实现追踪
    myLabel.h文件
    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;

二.定时器

1.定时器写法一

  1. 利用timerEvent(QTimerEvent *ev);
  2. 启动定时器startTimer(1000); //参数1 间隔(毫秒)
  3. timerEvent的返回值是定时器的唯一标识可以与ev->timerid做比较
    Widget.h文件
    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++));
    }
}

2.定时器写法二

  1. 添加头文件
#include <QTimer>
  1. 可以直接在Widget::Widget(QWidget *parent)中写,不用新建函数声明和实现
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++));
    });
}

3.按钮启动暂停定时器

//点击按钮停止计时器
    connect(ui->btn,&QPushButton::clicked,[=](){
        timer->stop();
    });

    connect(ui->btn2,&QPushButton::clicked,[=](){
        timer->start();
    });

三.Event事件分发器

  1. 用来进行事件分发,当设置某一事件为真时不向下分发,也可看做这一事件被拦截(不建议这么使用)
  2. mylabel.h中进行声明(bool型ture为真)
    bool event(QEvent *e);  //通过event事件分发器拦截鼠标按键
  1. mylabel.cpp中进行实现
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);    //其他事件交给父类,以默认方式处理
}

四.Event事件过滤器

  1. 在程序和事件分发器中间进行过滤
  2. 给控件安装过滤器(Widget.cpp函数)
    ui->label->installEventFilter(this);    //给label控件安装事件过滤器
  1. 重写eventfilter事件
    Widget.h中进行声明
bool eventFilter(QObject *,QEvent *);    //重写事件过滤器的事件
  1. Widget.cpp中实现
#include <QMouseEvent>
#include <QDebug>
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); //默认处理
}

QT-day06

一、绘图事件(Qpainter)

1.绘图基本操作

  1. 设置绘图事件(Widget.h函数的public中)
void paintEvent(QPaintEvent *); //绘图事件
  1. 设置画笔头文件(Widget.cpp中)
#include <QPainter> //画笔类
  1. 实现画笔函数(Widget.cpp中)
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),"汉字");    //在矩形框中画字
}

2.绘图高级设置

  1. 抗锯齿-效率会变低(Widget.cpp中)
painter.setRenderHint(QPainter::Antialiasing);  //设置抗锯齿
  1. 画家移动位置(Widget.cpp中)
painter.translate(100,0);   //让画家移动位置,由0,0变为100,0
  1. 保存画家位置(Widget.cpp中)
painter.save(); //保存画家位置
  1. 还原画家保存的位置(Widget.cpp中)
painter.restore();  //还原画家保存的位置
  1. 代码示例:
/**************************绘图高级设置************************************/    
    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));   //画矩形

3.手动调用绘图事件

  1. 通过资源文件画图片(Widget.cpp中)
/**************************手动调用绘图事件-通过资源文件画图片**************************/

    QPainter painter(this); //实例画笔对象,this代表在当前窗口下
    //(posX,posY,100,100,QPixmap(":/Picture/01.jpg")
    //参数一:x  参数二:y  参数三:长  参数四:宽  参数五:图片路径(参数三四不要时默认画到图片大小)
    painter.drawPixmap(posX,posY,100,100,QPixmap(":/Picture/01.jpg"));
  1. 添加按钮实现图片移动(Widget.h的public中)
    int posX = 0;
    int posY = 0;
  1. 添加按钮实现图片移动(Widget.cpp中)
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更新
    });
}

4.绘图设备

4.1 QPixmap作为绘图设备,专门对平台进行优化(Widget.cpp中)
#include <QPixmap>
#include <QPainter>
    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");    //保存到指定路径
4.2 QImage作为绘图设备
  1. 可以对像素进行访问(Widget.cpp中)
#include <QPixmap>
#include <QPainter>
    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");    //保存到指定路径
  1. 可以对像素进行修改
    Widget.h中添加声明
    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);
}
4.3 QPicture作为绘图设备
  1. QPicture 可以记录并重现绘图指令
#include <QPicture>
//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);
4.4 QChart-实时曲线
  1. UI设计界面创建Graphics View将其提升为QChart类(chartView)
  2. 添加核心文件QT += core gui charts
  3. 添加头文件QT_CHARTS_USE_NAMESPACE
  4. `
#include "widget.h"
#include "ui_widget.h"
#include <QValueAxis>
#include <QSplineSeries>    //曲线
#include <QLineSeries>  //折线
#include <QtCharts/QSplineSeries>

#include <QPainter>
#include <QPointF>
#include <QPen>
#include <qmath.h>

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;
}


二、文件读写

1.文件读写操作(QFile)

#include <QFileDialog>
#include <QFile>
#include <QTextCodec>
//点击按钮,弹出打开文件对话框
    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();

2.读取文件信息(QFileInfo)

#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
//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");

总结

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值