Qt基本知识

Qt第一天使用

1.创建项目

  1. 项目中项目名字不能有中文,路径中也不能有中文
  2. Qmainwindows是Qwidget和QDialog的父类,父类很多东西都不包含
  3. 版本控制系统-对团队开发起作用,

2. 代码解释

     1.QT       += core gui  、、包含的模块,所述的包含的类可以使用
     2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets// 4版本以上加入widgets
     3. TARGET = QT_20190705//,目标  生成的.exe程序名称
     4. TEMPLATE = app   // 模板
     5. SOURCES...//源文件
     6. HEADERS..//头文件
     7. mian.cpp
     		- #include "widget.h"  //头文件
              #include  // 应用程序类
                                                           //  argc 命令行变量的数量 argv 命令行变量数组
              QApplication a(argc, argv);//a应用程序对象,Qt中有且就有一个应用程序对象,获取操作,例如鼠标点击
               Widget w;  // 创建一个自定义窗口对象
               w.show(); //窗口对象弹出函数
               return a.exec();//进入消息循环机智,阻塞代码
     8.
     	#ifndef WIDGET_H
		#endif // WIDGET_H  //防止头文件相互包含,类似于#program 
		#include       //父类(基类)

		Q_OBJECT// Q_OBJECT提供了Qt中的信号和槽的机制

3基本使用

3.1基本快捷键以及button控件使用展示

//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include 
/*
 * 命名规范
 * 类名首字母大写 单词与单词之前首字母大写
 * 函数,变量...首字母大写
 * 常用快捷键
 * ctrl +R 运行
 * ctrl + B 编译
 * F1 帮助文档 选中一个变量,按住F1
 * 注释快捷键ctrl + /
 * 字体的缩放 ctrl +鼠标滚轮
 * 整行代码的移动 ctrl +shift + 上箭头或者下箭头
 * 查找 ctrl + f
 * 自动对齐 ctrl+ i
 * 同名之间的.h和.cpp切换 ctrl + F4
 * 帮助文档 F1,左侧列表,帮助文档另外的程序
 *
 *
 *
 */
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPushButton *btn = new QPushButton;
   // btn->show();// 默认是用顶层的方式弹出窗口
    //预期想要按钮依赖大窗口弹出
    btn->setParent(this);//给button找一个父类
    btn->setText("周五");
    QPushButton *btn2 = new QPushButton("下雨");//在相同的位置会覆盖原来之前同位置的东西
    btn2->setParent(this);
    btn2->move(100,0);
    this->resize(600,400);//设置窗口大小
    this->setWindowTitle("fiist program");//设置窗口标题
    this->setFixedSize(600,400);  //设置窗体的固定大小



}

Widget::~Widget()
{
    delete ui;
}

3.2对象树的概念及其创建顺序

  1. 在创建对象树的时候,如果父类是Qobject或者Qobject的派生类,这个对象可以不用去管理释放,会放到一个对象树上,析构函数会自动管理对象的释放
  2. 析构的顺序和释放的顺序是相反的

3.3Qt中的坐标系

左上角是(0,0)点,往右→增加,往下增加

3.4信号和槽的概念

  1. connect(信号的发出者(指针),信号内容(地址),信号的接受者(指针),处理信号(槽函数地址))
connect(btn2,&QPushButton::clicked,this,&Widget::close);//
// 其中QPushButton换成其子类也可以,实现点击button2关闭窗口
  1. 信号槽的优点:松散耦合,将两个不想关的内容关联起来

3.5自定义信号的处理

  1. 各种信号和槽的写法
  2. 有参与无参数写法的区别(当信号槽发生重载了,就需要使用函数指针指明需要的槽函数的地址)
  3. 扩展
    • 信号可以连接信号
    • 一个信号可以连接多个槽函数
    • 多个信号可以连接同一个槽函数
    • 信号和槽的参数类型必须一一对应
    • 信号的参数个数可以多余槽函数的个数,但是类型也必须一一对应
    • 信号和槽可以断开连接

3.5Qt4版本以前信号和槽的写法

//缺点: 参数类型 不做检测,原因在于SIGNAL和SLOT括号下的内容转为字符串SIGNAL(“hungry(int))”)
//优点: 参数类型比较直观

 connect(zt,SIGNAL(hungry(QString)),st,SLOT(treat(QString)));
 //  classover();                  

3.6 lambda表达式

[capture](parameters)mutable->return-type
{
statement;
}
[函数对象参数](操作符重载函数参数)mutable->返回值{函数体}

  1. 参数
    * [] ,标识一个lambda的开始,必须存在,不能省略,函数对象参数是传递给编译器自动生成的函数对象类的构造函数,函数对象参数只能是哪些到定义lambda所在作用范围内可见的局部变量(包括lambda所在类的this)有以下形式
    -空:没有使用任何函数对象参数。
    - = :函数体可以使用lambda所在作用范围内所有可见的局部变量(包括lambda所在类的this),并且是以值传递的方式(相当于编译器自动帮我们按值传递了所有局部变量)
    - & :函数体可以使用lambda所在作用范围内所有可见的局部变量(包括lambda所在类的this),并且是以引用传递的方式(相当于编译器自动帮我们按引用传递了所有局部变量)
    - this :函数体内可以使用lambda所在类中的成员变量,和=差不多
    - a :将a按照值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数时const的 ,要修改传递进来的a的拷贝,可以添加mutable修饰符,不能对其他变量进行修改
    - &a: 将a 按照引用进行传递
    - a,&b:a 按照值传递,b按照引用传递
    - =,&a,&b:除a,b被引用传递外,其他参数按照值传递
    - &,a,b:除a,b按照值传递,其他按照引用进行传递
    • ()操作符重载函数参数
      标识重载的()操作符的参数,没有参数时,这部分可以省略,参数可以通过按值(如(a,b)) 和按引用(如:(&a,&b))两种方式进行传递
    • 可修改标识符
      mutable 声明,可省,按照值传递函数对象函数时,加上mutable修饰符后可以修改按值传递进来的拷贝(修改的是拷贝,而不是值本身)
    • ->(返回值)+类型
    • CONFIG += c++11 对于qt4版本前的低版本使用lamdba表达式必须要加入的行配置信息

4.QMainWindow

Qt基本知识_第1张图片

4.1 组成介绍

  • 铆接部件:可以单独作为一部分窗口的部件

4.2 菜单栏、工具栏、状态栏、铆接部件,核心部件

  1. 菜单栏只能有一个
	 QMenuBar *bar = menuBar();
 	 setMenuBar(bar); //设置到窗口中
 	 QMenu*fileMenu =  bar->addMenu("文件");
    QMenu *editMenu = bar->addMenu("编辑");
    //添加菜单项
    QAction *newaction =   fileMenu->addAction("新建");
    //添加分割线
    fileMenu->addSeparator();
    QAction *openaction =   fileMenu->addAction("打开");//返回一个QAction
  1. 工具栏
  //工具栏  可以有多个
    QToolBar * toolbar = new QToolBar(this);
    //addToolBar(toolbar);默认上部分
    addToolBar(Qt::LeftToolBarArea,toolbar);//第一个参数是枚举值,
    toolbar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);
    toolbar->setFloatable(false);//设置浮动
    toolbar->setMovable(false);//设置移动
    //工具中添加小控件
    QPushButton *btn = new QPushButton("按钮",this);
    toolbar->addWidget(btn);
    //工具栏中添加·菜单项
    toolbar->addAction(newaction);
    toolbar->addSeparator();
    toolbar->addAction(openaction);
  1. 状态栏
//状态栏 只有一个
  QStatusBar *statu =  statusBar();
  //将状态栏放入状态栏
  setStatusBar(statu);
  QLabel *lable = new QLabel("左侧信息",this);//一个专门显示文字的对象
  //将标签 放入到 状态栏中
  statu->addWidget(lable);
  QLabel* lable2 = new QLabel("右侧信息",this);
  statu->addPermanentWidget(lable2);//从右往左
  1. 铆接部件,浮动窗口
 //铆接部件,浮动窗口 可以有多个
    QDockWidget * dock = new QDockWidget("铆接部件",this);
    addDockWidget(Qt::BottomDockWidgetArea, dock);// 放在核心部件的下面
    // 可以设置停靠范围
    dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
    //this->addDockWidget(dock);
  1. 核心部件
    //核心部件  只能有一个
    QTextEdit * edit = new QTextEdit(this);
    setCentralWidget(edit);

4.3 资源文件

  1. 将资源文件导入到项目中
  2. 添加文件 ->Qt->Qt recourse File
  3. 添加前缀,添加路径
  4. 使用
    //在新建的菜单项上-显示图片
   // ui->actionnew->setIcon(路径);

    //资源文件 使用方式 " :+前缀名+文件名"
    ui->actionnew->setIcon(QIcon(":/img/pdfext.png"));
    ui->actionopen->setIcon(QIcon(":/img/noteext.png"));

4.4 对话框创建

  1. 对话框的分类
// 对话框的分类
        // 模态对话框  不可以对其他窗口进行操作
        // 非模态对话框  可以对其他窗口进行操作
        //1.模态对话框
        QDialog dlg(this);
        dlg.exec();//阻塞功能,使得它一下代码不能执行

        //非模态对话框
       // QDialog dlg2(this);
       // dlg2.show();  这样的话有问题,因为在函数里面的变量会被释放

        QDialog *dlg2 = new QDialog(this);
        dlg2->show();
        dlg2->setAttribute(Qt::WA_DeleteOnClose);//55号属性 在关闭窗口的时候释放空间
  1. Qmessagebox标准对话框(系统自带)
    * 弹出的所有的都是模态对话框
    * 可以利用静态成员函数实现不同的对话框,
 //弹出提示对话框
 #include
        // Qmessagebox 错误对话框
        QMessageBox::critical(this,"错误","wrong");


        // 信息对话框
        QMessageBox::information(this,"tishi","you have a wrong");

        //提问对话框
        // 参数1 父窗口  参数2 标题 参数3 文本 参数4 按键类型 参数5 默认关联回车
        if(QMessageBox::Save== QMessageBox::question(this,"wrong","do you have some question",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
        {
            qDebug()<<"点击率保存";
        }
        else {
            qDebug()<<"cannel";
        }

        // warning meesagebox
        QMessageBox::warning(this,"wrong","some wrong");
  1. 其他对话框
 // 文件对话框  参数1 父窗口 参数2 标题 参数3 默认打开路径 参数4 过滤后缀名
 //使用时加上头文件
         QString filename =    QFileDialog::getOpenFileName(this,"打开文件","D:\\dalaocode\\dalao  for Dev","*.cpp");
       qDebug()<<"打开的文件是"<<filename;

        //颜色对话框
       QColor color =  QColorDialog::getColor(QColor(255,0,0));
      qDebug()<<color.red()<<color.green()<<color.blue();

        //字体对话框
        bool ok;
        QFont font = QFontDialog::getFont(&ok,QFont("黑体",36));
        qDebug()<<font.family()<<font.pointSize()<<font.italic()<<font.bold();
        // 什么字体 ,字号,是否倾斜, 是否加粗

5.布局

1. 主要内容讲解

  1. QWidget布局
    在容器中做水平布局,垂直布局,栅格布局,可以修改垂直大小,垂直策略改为fixed
    可以修改间隙
  2. 弹簧
    sizetype:调整可伸缩

6. 常用控件介绍

6.1 按钮控件

  1. pushbutton:可放图片,
  2. tool button:一般放图片,可以iocnsize设置图片大小
    autoraise 可以设置放上去的触发效果
    如果要显示图片,可设置toolbuttonstyle
  3. Qradiobutton
    默认选中是:ui->radio_man->setChecked(true);//设置默认选项
  4. Qcheakbox 复选按钮
    2:选中 1 :半选中 0:未选中
//第二个信号有一个参数,可以被槽函数捕捉
connect(ui->checkBox,&QCheckBox::stateChanged,[=](int state){
        qDebug()<<"state is"<<state;
    });

6.2 QListWidget

  1. 每个项都被称为Qlistwidgetitem
 //listwidget
    QListWidgetItem * item = new QListWidgetItem("锄禾日当午");
    ui->listWidget->addItem(item);
    item->setTextAlignment(Qt::AlignHCenter);// 设置对齐


    // QstringList
    QStringList list;
    list<<"锄禾日当午"<<"汗滴禾下如"<<"谁知盘中餐"<<"粒粒皆辛苦";
    ui->listWidget->addItems(list);

6.3 树控件

// treewidget树控件的使用
    //设置头
    ui->treeWidget->setHeaderLabels(QStringList()<<"hero"<<"introduce of hero");

    //Treewidgeet 中每个项目都称为QTeeWidgetItem
    QTreeWidgetItem * Pitem = new QTreeWidgetItem(QStringList()<<"power");
    QTreeWidgetItem * Sitem = new QTreeWidgetItem(QStringList()<<"speed");
    QTreeWidgetItem * Iitem = new QTreeWidgetItem(QStringList()<<"IQ");

    //添加根节点
    ui->treeWidget->addTopLevelItem(Pitem);
    ui->treeWidget->addTopLevelItem(Sitem);
    ui->treeWidget->addTopLevelItem(Iitem);

    QStringList hero1,hero2,hero3,hero4,hero5,hero6;
    hero1<<"耀"<<"战士,不会玩";
    hero2<<"典韦"<<"战士fnahfgafhg";
    hero3<<"耀"<<"战士,不会玩";
    hero4<<"典韦"<<"战士fnahfgafhg";
    hero5<<"耀"<<"战士,不会玩";
    hero6<<"典韦"<<"战士fnahfgafhg";

    //add children node
    QTreeWidgetItem *L1 = new QTreeWidgetItem(hero1);
    QTreeWidgetItem *L2 = new QTreeWidgetItem(hero2);
    //QTreeWidgetItem *L3 = new QTreeWidgetItem(hero3+hero4);
    Pitem->addChild(L1);
    Sitem->addChild(L2);
    //Iitem->addChild;

6.4 table控件


    //tablewidget 使用
    //设置列
    ui->tableWidget->setColumnCount(3);

    //设置水平表头
    ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"性别"<<"性别"<<"age");
    //设置行数
    ui->tableWidget->setRowCount(5);

    //设置具体的内容
    ui->tableWidget->setItem(0,0,new QTableWidgetItem("yase"));

    QList<QString> namelist;
    namelist<<"亚瑟"<<"安其拉"<<"王昭君"<<"曹操"<<"刘备";
    QStringList sexlist;
    sexlist<<"男"<<"女"<<"nan"<<"女"<<"nan";
    for(int i=0;i<5;i++)
    {
        int col = 0;
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(namelist[i]));
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(sexlist.at(i)));

        //int 转Qstring
        ui->tableWidget->setItem(i,col++,new QTableWidgetItem(QString::number(18+i)));
        col = 0;
    }

6.4其他控件介绍

  1. 栈控件
  2. 下拉框
  3. label 显示图片(以及动图)
// 点击切换按钮实现切换
    int cou=0;
    connect(ui->qiehuan,&QPushButton::clicked,[&](){
        ui->stackedWidget->setCurrentIndex(2);
        if(cou==3)
            cou=0;
    });  //切换失败,我也不知道为什么

    ui->comboBox->addItem("奔驰");
    ui->comboBox->addItem("宝马");
    ui->comboBox->addItem("宏碁");

    // 点击按钮 定位到拖拉机
    connect(ui->con_combo,&QPushButton::clicked,[=](){
        ui->comboBox->setCurrentIndex(2);
        //ui->comboBox->setCurrentText("宝马"); 两种形式


    });

    //利用label 显示图片
    ui->labeld_imgge->setPixmap(QPixmap(":/img/pdfext.png"));

    //利用label显示动图
    QMovie *movie = new QMovie(":/img/hello.gif");
    ui->label_gif->setMovie(movie);

    // 播放movie动图
    movie->start();

7 其他操作

7.1 自定义控件封装

  1. 添加类 Qt设计师界面类,.h,.cpp.ui
  2. 提升(将基类的名称填写正确),记得选为全局
  3. 使用自定义控件,封装,提供自定义的接口,以及自定义信号和槽

7.2事件处理

  1. 捕获Qlabel中的鼠标事件
  2. enterEvent
  3. leaveEvent
  4. mousePressEvent(QMouseEvent *ev)
    通过ev可以获取一些参数,例如鼠标按下的左键右键还是中键·,判断移动状态,需要利用ev->buttons() & 要判断的键
    Qstring格式化字符串 Qstring(x=%1,y=%2).arg(x).arg(y);
  5. mouseRealseEvent
  6. mouseMoveEvent
void myLabel::enterEvent(QEvent *)
{
    //qDebug()<<"mouse enter";
}

// 捕获鼠标离开
void myLabel::leaveEvent(QEvent *){
    //qDebug()<<"mouse leave";
}
// 鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev){
    // 判断只有左键按下才能打印信息
    if(ev->button()==Qt::LeftButton)
    {
        qDebug()<<"mouse 按下";
    }

}

//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev) {
    qDebug()<<"mouse 释放";
}

//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev){

    if(ev->buttons()& Qt::LeftButton)//有点迷糊,大概意思就是移动的时候可能是左右键同时移动
        //联合移动
    {
        QString str = QString("鼠标按下了 x=%1  y=%2").arg(ev->x()).arg(ev->y());
        qDebug()<<str;
    }
}

7.3 定时器

  • 事件
  1. 可以重写timerEvent函数
  2. 通过e获取到的定时器的id e->timeid
  3. 启动定时器 starttimer(ms),返回值就是定时器唯一的标识
id1 = startTimer(1000);// 会返回一个int型的标志
    id2 = startTimer(2000);
}
void Widget::timerEvent(QTimerEvent *e)
{
    if(e->timerId()==id1)
    {
        static int num = 1;// 保证每次函数调用完之后值任然有效
        ui->label_2->setText(QString::number(num++));

    }
    else {
        static int num2 = 1;
        ui->label_3->setText(QString::number(num2++));
    }

}//定时器事件

  • QTimer 类·
//利用QTimer定时器的类,实现定时功能
    QTimer * timer = new QTimer(this);// 添加到对象树上
    timer->start(500);
    connect(timer,&QTimer::timeout,[=](){
        static int num3 = 1;
        ui->label_4->setText(QString::number(num3++));
    });

    //点击button 实现定时器的暂停
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        timer->stop();
    });

7.4 事件分发器

  1. bool event(QEvent *e)
  2. e->type() 所有Qt中的事件
  3. 事件分发器中可以做时间的拦截,如果用户进行了拦截,在对应的事件中返回true,其他的事件则交给他的父类进行处理
bool myLabel::event(QEvent *e){
    if(e->type()== QEvent::MouseButtonPress)
    {
        QMouseEvent* ev = static_cast<QMouseEvent*>(e);
        QString str = QString("鼠标按下了 x=%1  y=%2").arg(ev->x()).arg(ev->y());
        qDebug()<<str;
        return true;//代表如果是,鼠标按下,用户自己处理
    }
    //其他事件 交给父类处理 默认处理
    return QLabel::event(e);
}

7.5事件过滤器

利用事件过滤器,可以做更高级的拦截
使用事件过滤器有两步:

  1. 给对应的事件安装过滤器
  2. 重写eventFilter事件
 //利用事件过滤器给第一个label做一个更高级的时间拦截
    //步骤1, 给label安装事件过滤器
    ui->label->installEventFilter(this);
    //步骤2

}
// 参数1 对比控件用  参数2 对比事件
bool Widget::eventFilter(QObject* obj,QEvent * e){
    if(obj==ui->label){
        if(e->type()== QEvent::MouseButtonPress)
        {
            QMouseEvent* ev = static_cast<QMouseEvent *>(e);
            QString str = QString("evenFilter 中鼠标按下了 x=%1  y=%2").arg(ev->x()).arg(ev->y());
            qDebug()<<str;
            return true;//代表如果是,鼠标按下,用户自己处理
        }
    }
    return QWidget::eventFilter(obj,e);

}

Qt基本知识_第2张图片

7.6绘图事件

  1. 低级操作
    重写事件 paintEvent,
    声明画家,使用
    画线,圆,矩形
void Widget::paintEvent(QPaintEvent *){
    //声明画家对象,在窗口设备中绘制图片
    QPainter painter(this);

    QBrush brus(Qt::cyan);// 设置画刷
    brus.setStyle(Qt::Dense3Pattern);
    painter.setBrush(brus);// 让画家使用画刷

    //划线
    painter.drawLine(QPoint(0,0),QPoint(100,100));

    //画圆(特殊的椭圆)
    painter.drawEllipse(QPoint(100,100),50,50);

    //画一个矩形
    painter.drawRect(QRect(20,20,50,50));

    // 画文字
    painter.drawText(QPoint(100,100),"SB__SYD");

    // 指定画笔
    QPen pen(QColor(255,0,0));
    //设置笔宽(像素)
    pen.setWidth(3);
    //设置笔的风格
    pen.setStyle(Qt::DotLine);
    // 让画家使用这支笔
    painter.setPen(pen);
    // 画文字
    painter.drawText(QRect(100,100,100,100),"SB__SYD");

}
  1. 高级画家
// 高级
    QPen pen(QColor(255,0,0));
    pen.setWidth(3);
    //pen.setStyle(Qt::DotLine);
    painter.setPen(pen);
    painter.drawEllipse(QPoint(100,100),50,50);
    // 设置抗锯齿 效率比较低
    painter.setRenderHint(QPainter::HighQualityAntialiasing);

    painter.drawEllipse(QPoint(250,100),50,50);
    painter.drawRect(QRect(20,20,50,50));
    painter.translate(QPoint(100,0));// 改变画家初始坐标系
    painter.save();//保持画家的状态
    painter.drawRect(QRect(20,20,50,50));
    painter.translate(QPoint(100,0));
    painter.restore();//还原画家的状态
    painter.drawRect(QRect(20,20,50,50));

    //利用画家绘制图片
    posx += 10;

    //超出屏幕,重置posx
    if(posx>this->width())
    {
        posx = 10;
    }
    painter.drawPixmap(posx,100, QPixmap(":/img/pdfext.png"));
//绘图事件
    posx = 10;//
    // 点击按钮实现图片的移动
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        // 手动调用paintEvent函数 利用 update,重新绘制图片1·
        posx += 10;
        update();
    });

7.7 其他绘图设备

  • Qpixmap 专门为图像在屏幕上的显示做了优化,window和linux不一样
  • QBitmap 是·Qpixmap的一个子类,色深限定为1,可以使用Qpixmax的isQBitmap()函数来确定这个Qpimax是不是一个QBitmap,只有黑白色
  • QImage 专门为图像的像素级访问做了优化
  • Qpicture则可以记录和重现QPainter的各类命令
  • QImage 和QPicture可以相互转化
//QPixmap 做绘图的设备
    //对不同的平台做了显示的优化
//    QPixmap pix(300,300);// 声明一张纸的大小
//    pix.fill(Qt::white);//change the background to white
//    QPainter painter(&pix);
//    painter.setPen(QPen(Qt::red));// a red pen;
//    painter.drawEllipse(QPoint(100,100),100,100);

//    // save
//    pix.save("D:\\dalaocode\\Qt\\Qt20190711001\\one.png");//

    //QImage 做绘图的设备
    //可以对像素进行访问
//    QImage img(300,300,QImage::Format_RGB32);
//    img.fill(Qt::white);//change the background to white
//    QPainter painter(&img);
//    painter.setPen(QPen(Qt::red));// a red pen;
//    painter.drawEllipse(QPoint(100,100),100,100);

//    // save
//    img.save("D:\\dalaocode\\Qt\\Qt20190711001\\two.png");//

    QPicture pic;// 记录和重现Qpainter的各条命令
    QPainter painter;
    painter.begin(&pic);
    painter.setPen(QPen(Qt::blue));// a red pen;
    painter.drawEllipse(QPoint(100,100),100,100);


    painter.end();
    pic.save("D:\\dalaocode\\Qt\\Qt20190711001\\iii.lyb");
void Widget::paintEvent(QPaintEvent *){//系统调用这个函数
//    QImage img;
//    img.load(":/img/pdfext.png");
//    QPainter painter(this);
//    for(int i=50;i<100;i++)
//    {
//        for(int j=50;j<100;j++){
//            QRgb value = qRgb(255,0,0);
//            img.setPixel(i,j,value);
//        }
//    }
//    painter.drawImage(0,0,img);

    QPainter painter(this);
    // 重现Qpicture 的绘图命令
    QPicture pic;
    pic.load("D:\\dalaocode\\Qt\\Qt20190711001\\iii.lyb");
    painter.drawPicture(30,30,pic);

}

7.8 文件读写

 // 点击选择文件,将文件中的内容读取到文本框中
    connect(ui->pushButton,&QPushButton::clicked,[=](){
       QString filePath =  QFileDialog::getOpenFileName(this,"选择文件","D:\\软件专用储存\\chrome","(*.txt *.png)");
        //qDebug()<
       // 将文件路径放入到 linetext中
       if(filePath.isEmpty())
       {
           QMessageBox::warning(this, "打开失败","文件路径为空");
           return;
       }
       ui->lineEdit->setText(filePath);

       QTextCodec *code = QTextCodec::codecForName("gbk");

       //将文件内容 放入到 textEdit中
       QFile file(filePath);//默认支持格式utf-8

       // 设置打开方式
       file.open(QIODevice::ReadOnly);//以只读的方式打开
       QByteArray arr;
       //arr = file.readAll(); 读取所有
       while(!file.atEnd())
       {
           arr += file.readLine();//一行一行的读
       }

       //显示数据
       /*ui->textEdit->setText(code->toUnicode(arr));*/// 将指定字符串转化为目标格式的gdk格式

       ui->textEdit->setText(code->toUnicode(arr));
       file.close();// 关闭文件
       file.open(QIODevice::Append);//追加的方式写
       file.write("hello");
       file.close();




    });

7.9 文件信息类

 //文件信息类
       QFileInfo info(filePath);
       qDebug()<<"size:"<<info.size()<<"后缀名:"<< info.suffix()<<"文件名:"<<info.fileName()<<"filePath:"<<info.filePath();

       qDebug()<<"创建日期:"<<info.created().toString("yyyy/MM/dd hh:mm:ss");

       qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");
       

8 打包发布

  1. 采用reaealse 编译,之后,将其中的程序放入到一个新文件夹中,利用qt中的windeployqt.exe 安装拷贝所依赖的库,具体操作就是在cmd窗口中,找到程序的.exe所在文件,利用cmd窗口执行

windeployat 程序所在路径及其文件名】
即有所依赖的库就将所需要的库安装成功
HM nis Edit 软件可以生成一个安装包

你可能感兴趣的:(技术分享,Qt学习,基本Qt操作)