QT学习日记

QT学习日记

一.QWidget

版本选择:win下选择MINGW (编码UTF-8)

选择Qwidget之后勾选mingw不然会报错

初识main.cpp

详解:

#include "widget.h"
#include <QApplication>
//main程序入口
int main(int argc, char *argv[])
{
    
    

    //应用程序对象有且仅有一个
       QApplication a(argc, argv);
    //窗口对象Widgt继承父类QWidget
    Widget w;
    //show方法
    w.show();
    //消息循环,不会结束
    return a.exec();
}

pro文件解释


//QT的核心模块

QT       += core gui
//大于4以上才有widgets版本
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
//目标文件
TARGET = Demo01
//模板--application
TEMPLATE = app


DEFINES += QT_DEPRECATED_WARNINGS


CONFIG += c++11

//源文件
SOURCES += \
        main.cpp \
        widget.cpp
//头文件
HEADERS += \
        widget.h

FORMS += \
        widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

命名规范

类名:首字母大写,单词与单词直接首字母大写

函数名:首字母小写,单词与单词首字母大写[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wMnlWjO-1617466776739)(Lily_Screenshot_1608472881.png)]

查找ctrl+f

自动对齐Ctrl+i

同名.h和.cpp切换f4

写代码了

QPushButton *button =new QPushButton();
//以顶层弹出
//button->show();
//让button依赖在Widget中显示,setParent是设置一个父窗口
button->setParent(this);
//这个设置要在下面,这是底层的问题
ui->setupUi(this);

带参数构造

发现与原来的按钮重叠

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u7SEwuVW-1617466776741)(Lily_Screenshot_1608474766.png)]

//窗口固定大小
setFixedSize(600,400);

指定父类就会把子类添加到对象树里面,这样析构的时候就会释放对象树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bRrEnGG9-1617466776745)(image-20201220232553431.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpybSAjz-1617466776747)(image-20201220235015356.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNcLMhHi-1617466776749)(image-20201220234957297.png)]

坐标体系

左上角向下y向右x

信号和槽

信号的处理(槽函数)

优点:接受和发送没有关联

1.实现功能点击按钮关闭窗口

按钮名字,&类名地址::信号,窗口名字,&类名地址::槽函数

//设置按钮button2关闭窗口
connect(button2,& QPushButton::clicked , this , & QWidget::close);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8r3KG4v6-1617466776750)(image-20201221123927942.png)]

自定义信号

信号在建立类之后会有,默认继承Qobject类不用释放

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZltgUkY-1617466776752)(image-20201221131238328.png)]

signals:
    //只要声明不用实现
    //返回一个void就行
    void classover();

自定义槽

打印函数

头文件定义槽

cpp重写槽函数

#include "student.h"
#include<QDebug>

Student::Student(QObject *parent) : QObject(parent)
{
    
    

}

 void Student::Food()
 {
    
    
     qDebug()<<"下课吃饭了";
 }

在widget的头文件里面写入private的对象

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include"teacher.h";
#include"student.h";

namespace Ui {
    
    
class Widget;
}

class Widget : public QWidget
{
    
    
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    
    Teacher *teacher;
    Student *student;
        connect(zyq,&Teacher::classover,lpy,&Student::Food);

    Classover();
}

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


void Widget::Classover(){
    
    
    //触发下课的信号
    emit zyq->classover();

}
};

先创建对象,再建立连接,最后调用函数触发信号( emit zyq->classover();)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrSjy6vg-1617466776753)(image-20201221234232202.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zMirtRv-1617466776754)(image-20201221234547927.png)]

qDebug()<<“XXX is sb”

    //重载函数后,连接会不明确指向的是哪个函数,需要手动void 一个地址
void (Teacher::*tea)(QString)=&Teacher::classover;
 void (Student:: *stu)(QString)=&Student::Food;

    connect(zyq,tea,lpy,stu);
    Classover();

string转换为 char * (utf-8.data)

  qDebug()<<"老师要吃"<<FoodName.toUtf8().data();

信号连接信号

//无参信号和槽连接
void (Teacher:: *teaSignal(void)=&Teacher::classover;
void (Student:: *stuSlot)(void)=&Student::Food;
connect(zyq,teaSignal,lpy,stuSlot);

//信号连接信号
connect(button,&QPushButton::clicked,zyq,teaSignal);
//断开连接
    disconnect(zyq,teaSignal,lpy,stuSlot);

拓展

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udkJ10Xs-1617466776755)(image-20201222151936461.png)]

Lambda表达式

[button](){
    
    
    button->setText("aaaaa");
}();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dplr0Dpd-1617466776756)(image-20201222154708320.png)]

mutable声明修改只读状态,并且只修改拷贝的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnTw6jhb-1617466776757)(image-20201222160024268.png)]

建立连接

    void (Teacher:: *tea)(QString)=&Teacher::classover;
    void (Student:: *stu)(QString)=&Student::Food;

        connect(zyq,tea,lpy,stu);
    //使用lambda表达式关闭窗口
    QPushButton *btn=new QPushButton("close",this);

    connect(btn, &QPushButton::clicked, this, [this](){
    
     this->close(); }
                   emit zyq->classover("cc");
);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJOfsYOT-1617466776758)(image-20201222185244348.png)]

二.QMainWindow

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaJeOM8z-1617466776759)(image-20201222183411211.png)]

1.菜单项目

//创建菜单MenuBar
    QMenuBar *bar= menuBar();
    //放入窗口
    //包含头文件  #include<QMenuBar>
    setMenuBar(bar);

    //创建菜单
   QMenu *menu01= bar->addMenu("病人名单");
   QMenu *menu02= bar->addMenu("医生名单");
   QMenu *menu03= bar->addMenu("病例记录");
   QMenu *menu04= bar->addMenu("太平间记录");

   //创建菜单项
   menu01->addAction("许音");
   menu01->addAction("张雅");
   //分隔符
   menu01->addSeparator();
   menu01->addAction("红衣");
   menu01->addAction("高枝");

2.添加工具栏

//Location
Constant
Value
Qt::LeftToolBarArea
0x1
Qt::RightToolBarArea
0x2
Qt::TopToolBarArea
0x4
Qt::BottomToolBarArea
0x8
Qt::AllToolBarAreas
ToolBarArea_Mask
Qt::NoToolBarArea
0

   //添加工具栏
   QToolBar *toolbar=new QToolBar(this);
   addToolBar(Qt::RightToolBarArea,toolbar);
    //只允许左右停靠
   toolbar->setAllowedAreas(Qt::RightToolBarArea | Qt::LeftToolBarArea);
    //设置浮动
   toolbar->setFloatable(true);
    //设置移动(权值大于前面)
   toolbar->setMovable(false);
  // 设置action
   toolbar->addAction(xuyin);
   toolbar->addAction(zhangya);
    toolbar->addSeparator();
    QPushButton *btn=new QPushButton("destroy",this);
    toolbar->addWidget(btn);

addWidget添加按钮

addAction添加QAction

3.状态栏

 //状态栏
    QStatusBar *Qsta=new QStatusBar();
    //加入窗口
    setStatusBar(Qsta);
    //设置左侧提示
    QLabel *x=new QLabel("恐怖屋");
    Qsta->addWidget(x);
    //设置右侧提示
    QLabel *y=new QLabel("第三病栋");
    Qsta->addPermanentWidget(y);

qt太多要记的了5555

4.浮动窗口

 //floatWidget
    QDockWidget *dock=new QDockWidget("show memory",this);
    addDockWidget(Qt::TopDockWidgetArea,dock);
    dock->setAllowedAreas(Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea);

5.设置核心部件

//设置central widget(有且只有一个)
    QTextEdit *textedit=new QTextEdit(this);
    setCentralWidget(textedit);

6.总结

只有一个的用set,能有多个的是add

三。图形化学习

3.1.设置图标

1.设置icon的绝对路径

 ui->setupUi(this);
    ui->actionnew->setIcon(QIcon("D:\\QTimage\\zhangya.jpg"));

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rgM0ZHu-1617466776760)(image-20201223221328068.png)]

2.设置icon的相对路径

添加文件夹到mainWindows的文件下,然后addnew QT resources,添加前缀,添加文件

有手就行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U2BcF4yO-1617466776761)(image-20201223222355484.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZ8AR6tZ-1617466776762)(image-20201223223251227.png)]

新版只需要去图片那里复制路径即可

perfect

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-akUrQTQw-1617466776763)(image-20201223223610985.png)]

3.2 对话框 (模态与非模态)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQFDsd0G-1617466776764)(image-20201223233707116.png)]

     //阻塞的模态,非模态(可对其他窗口操作)
    connect(ui->actionnew,& QAction::triggered,[=](){
    
    
        //        QDialog dia(this);
        //        dia.resize(200,200);
        //        dia.exec();
        //    qDebug()<<"dialog finished";

        //非模态(可对其他窗口操作)
        QDialog *dia2=new QDialog(this);
         //这个如果不释放主窗口就不会释放,会不停的泄露内存
        dia2->show();//只是闪一下
        dia2->resize(200,200);
        qDebug()<<"dialog finished";


    });

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dgpBnQuZ-1617466776765)(image-20201224000248780.png)]

//这个如果不释放主窗口就不会释放,会不停的泄露内存需要删除时候释放

   dia2->setAttribute(Qt::WA_DeleteOnClose);//55号属性

3.3标准对话框(重点)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yTHLdDPm-1617466776766)(image-20201224151059674.png)]

  //标准对话框
  // QMessageBox::critical(this,"critical","error404");
  //参数一:父亲窗口,参数二:标题,参数三:提示内容 参数四 按键类型 参数五:默认关联回车按钮
  QMessageBox::question(this,"请问要保存吗","该操作不可逆转",QMessageBox::Save |QMessageBox::Cancel,QMessageBox::Cancel );


//按下save保存
  if(QMessageBox::Save==QMessageBox::question(this,"请问要保存吗","该操作不可逆转",QMessageBox::Save |QMessageBox::Cancel,QMessageBox::Cancel ))
        {
    
    
            qDebug()<<"save";
        }
        else {
    
    
            qDebug()<<"cancel";
        }


 //颜色对话框
        QColorDialog::getColor(QColor(255,0,0));

文件对话框

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPLEtmEO-1617466776767)(image-20201224153951175.png)]

字体对话框

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jdc7heUe-1617466776768)(image-20201224154253938.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1HNgr3K-1617466776769)(image-20201224154424246.png)]

图形化界面:弹簧,widget的栅栏布局,widget要选垂直策略 fixed

3.4 Toolbar实现早期qq的聊天好友

设置按钮默认选中

    ui->sexbtnman->setChecked(true);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z3qCrtpX-1617466776770)(image-20201224235043761.png)]

checkbox默认值

半选状态(tristate)

3.4QListWidget

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEgwb3rS-1617466776771)(image-20201225171203913.png)]

字符串方法

QStringList string;
string<<"aaa"<<"ksk";
ui->list->addItems(string);

3.4QTreeWidget

    ui->tree->setHeaderLabels(QStringList()<<"ghost"<<"ability");

    //父节点
    QTreeWidgetItem *zy=new QTreeWidgetItem(QStringList()<<"张雅");
    QTreeWidgetItem *zw=new QTreeWidgetItem(QStringList()<<"张雅");
    QTreeWidgetItem *zi=new QTreeWidgetItem(QStringList()<<"张雅");
    QTreeWidgetItem *zo=new QTreeWidgetItem(QStringList()<<"张雅");

    //加入treewidget
    ui->tree->addTopLevelItem(zy);
    ui->tree->addTopLevelItem(zi);
    ui->tree->addTopLevelItem(zw);
    ui->tree->addTopLevelItem(zo);

    //子节点的加入
    QTreeWidgetItem *ch=new QTreeWidgetItem(QStringList()<<"张雅");
    zy->addChild(ch);

3.5Qtablewidget

    //表单窗体
    ui->table->setColumnCount(3);
    ui->table->setRowCount(3);
    ui->table->setHorizontalHeaderLabels(QStringList()<<"ghost"<<"sex"<<"age");

    QStringList ghost;
    ghost<<"zy"<<"xy"<<"xx";
    QStringList sex;
    sex<<"xx"<<"xy"<<"xx";
    QStringList age;
    age<<"zy"<<"xy"<<"xx";



    for (int i=0;i<3;i++) {
    
    
        for (int j=0;j<3;j++)
        {
    
    
            if(j==0)
            ui->table->setItem(i,j,new QTableWidgetItem(ghost[i]));
            else if(j==1)
             ui->table->setItem(i,j,new QTableWidgetItem(sex[i]));
            else
            ui->table->setItem(i,j,new QTableWidgetItem(age[i]));
        }
    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zZbfm0M0-1617466776772)(image-20201225182435210.png)]

3.6.。jpg和gif添加

  //textlabal,jpg,添加
    ui->pic->setPixmap(QPixmap(":/QTimage/tank.jpg"));
    QMovie *mo=new QMovie(":/QTimage/sisi.gif");
    //gif添加
    ui->gif->setMovie(mo);
    mo->start();

3.7自定义组件

设计师界面加好,然后主界面添加那个类然后提升为那个类

自己写函数实现功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bHSHdsKQ-1617466776773)(image-20201226004745735.png)]

qt的占位符号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LW5aycf0-1617466776773)(Lily_Screenshot_1608916724.png)]

还有个global是基于屏幕的x,y

左右键和滚轮的自定义函数

还有buttons的组合键位操作,,,不重要,用位操作实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pxR5Tj9v-1617466776774)(image-20201226012422798.png)]

#include<QMouseEvent>


void myLabel::enterEvent( QEvent *event)
{
    
    
    qDebug()<<"enter";
}
void myLabel::leaveEvent( QEvent *)
{
    
    
    qDebug()<<"leave";
}
void myLabel::mouseMoveEvent( QMouseEvent *event)
{
    
    
    QString str=QString("move to x :%1  y : %2 Global x: %3  y:%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());

    qDebug()<<str;
}

//设置鼠标追踪
setMouseTracking(true);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHavrNFb-1617466776775)(image-20201226014355595.png)]

3.8TIMEevent

方法一:重写一个timerevent,然后在函数里面调用一下

void Widget::timerEvent(QTimerEvent *)
{
    
    
    static int num=1;
    ui->lablel2->setText(QString::number(num++));
}

    if (ev->timerId()==id1){
    
    
        static int num=1;
        ui->lablel2->setText(QString::number(num++));
    }
    if (ev->timerId()==id2){
    
    
        static int num2=1;
        ui->label3->setText(QString::number(num2++));
    }

方法二:Qtimer头文件加自己写connect

    QTimer *timer=new QTimer(this);
    timer->start(500);

    connect(timer,&QTimer::timeout,[=](){
    
    
        static int num8=1;
        ui->label4->setText(QString::number(num8++));
    });

//按钮暂停和开始
    ui->btn->setText("stop");
    connect(ui->btn,&QPushButton::clicked,[=](){
    
    
        if(ui->btn->text()=="stop")
        {
    
    
        timer->stop();
        ui->btn->setText("start");
        }
        else {
    
    
            timer->start();
              ui->btn->setText("stop");
        }
    });

3.9.拦截事件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FaxI6Sap-1617466776776)(image-20201228175326473.png)]

  //1.给label安装事件过滤器
    ui->label->installEventFilter(this);
    //2.重写函数
 //2.重写filter函数
    bool eventFilter(QObject *,QEvent *);

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("XXXX") ;
           qDebug()<<str;
           return true;
       }
    }
    return  QWidget::eventFilter(obj,e);
}

4.Qpainter

1.导入画家类并且重写绘图事件PaintEvent

void Widget::paintEvent(QPaintEvent *){
    
    
    //实例化一个painter对象,并把目标作为参数传进构造函数

    QPainter p(this);

    //钢笔
    QPen pen(QColor(255,0,0));

    pen.setWidth(3);

    //设置画笔风格
    pen.setStyle(Qt::DashLine);

    p.setPen(pen);
    //设置画刷
    QBrush brush(QColor(0,255,255));
    
    p.setBrush(brush);
    
    //划线
    p.drawLine(0,0,100,100);
    //画圆(椭圆)
    p.drawEllipse(QPoint(100,100),30,30);
	//画矩形
    p.drawRect(20,20,50,50);
}

2.高级设置

  QPainter p(this);
    p.drawEllipse(QPoint(50,50),50,50);

    //设置抗锯齿能力
    p.setRenderHint(QPainter::Antialiasing);
    //设置画家的位置
    p.translate(100,100);
    
    //保存画家状态
    p.save();
    
    p.drawEllipse(QPoint(50,150),50,50);

    //还原画家状态
    p.restore();

3.导入图片操作

//用painter画出资源文件
QPainter q(this);
q.drawPixmap(poX,30,QPixmap(":/QTimage/zhangya.jpg"));

//按钮对图片进行移动
  connect(ui->btn,&QPushButton::clicked,[=](){
       poX+=20;
       update();
    });

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XyU9CZg7-1617466776778)(image-20201228193858207.png)]

5.QPixmap

pixmap自带缩放的功能scaled

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0jkVPFN-1617466776778)(image-20201228194855447.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TGNtUFIg-1617466776779)(image-20201228195121329.png)]

Qimage

//利用QImage 修改
    QImage img;
    img.load(":/QTimage/tank.jpg");


    for (int i=40;i<100;i++) {
        for (int j=40;j<100;j++) {

            img.setPixel(i,j,QRgb(qRgb(200,200,200)));
        }
    }
    q.drawImage(0,0,img);

Qpicture

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hA4XGP9d-1617466776780)(image-20201228201203025.png)]

5.Qfile读写

   #include<QFileDialog>
   
   connect(ui->pushButton,&QPushButton::clicked,[=](){
    
    
        //获取路径
        QString str= QFileDialog::getOpenFileName(this,"open file","D:\\QTimage");
        //写入textedit
        ui->lineEdit->setText(str);
        //读取文件
        QFile file(str);

        //查文档
        file.open(QIODevice::ReadOnly);
        //读取utf-8字节码文件
        QByteArray arr=file.readAll();
        //写入文件
        ui->textEdit->setText(arr);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2KYyEWLa-1617466776781)(image-20201228204859002.png)]

//写操作
         file.open(QIODevice::Append);

         file.write("aaqaa");
         file.close();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PxPiU8Wn-1617466776782)(image-20201228205649574.png)]

6.QFileInto

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nz3URSzJ-1617466776784)(image-20201228230857198.png)]

{

        img.setPixel(i,j,QRgb(qRgb(200,200,200)));
    }
}
q.drawImage(0,0,img);

### Qpicture

[外链图片转存中...(img-hA4XGP9d-1617466776780)]

## 5.Qfile读写

```cpp
   #include<QFileDialog>
   
   connect(ui->pushButton,&QPushButton::clicked,[=](){
        //获取路径
        QString str= QFileDialog::getOpenFileName(this,"open file","D:\\QTimage");
        //写入textedit
        ui->lineEdit->setText(str);
        //读取文件
        QFile file(str);

        //查文档
        file.open(QIODevice::ReadOnly);
        //读取utf-8字节码文件
        QByteArray arr=file.readAll();
        //写入文件
        ui->textEdit->setText(arr);

[外链图片转存中…(img-2KYyEWLa-1617466776781)]

//写操作
         file.open(QIODevice::Append);

         file.write("aaqaa");
         file.close();

[外链图片转存中…(img-PxPiU8Wn-1617466776782)]

6.QFileInto

[外链图片转存中…(img-Nz3URSzJ-1617466776784)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n8sQfErK-1617466776785)(image-20201228231107238.png)]

猜你喜欢

转载自blog.csdn.net/weixin_43965055/article/details/115423396