Qt学习笔记一

1 QT应用程序框架

1 MingW编译(GCC)
2 窗口基类Qwidget
3 窗口创建默认是隐藏,人为show
4 return a.exec()让程序一直执行等待用户操作(即事件发生)

2 项目文件

1 .pro头文件分模块qmake
2 版本
3 程序名
4 指定生成如app
5 原文件头文件

3 信号和槽

1 软件模拟中断,感兴趣就做出反应
2 connect(&b,&QPushButton::pressed,this,&Widget::close);信号发送者,信号,信号接受者,槽函数
3 一个信号可以连接多个槽函数,一个槽函数可以被多个信号连接
4 槽函数执行顺序是随机的不受控制
5 槽函数与可以是lambda表达式
6 信号槽连接成功后,可以断开连接disconnect

4 自定义槽

QT5:可以是任意的成员函数,普通全局,静态函数。
槽函数和信号一致(参数,返回值),信号无返回值,槽则也无返回值

5 自定义信号

1 应用举例:子窗口对父窗口发送信号
2 signals
3 无返回值
4 信号是函数声明,只需声明,无需定义
5 自定义槽函数emit xinhao,主函数中得到1信号进行处理

6 指定父对象

1 setParent
2 构造传参
3 父对象显示,上面的子对象自动显示

7 带参信号

1 信号可重载
2 qt5区分重载信号用函数指针
3 qt4信号连接,槽必须修饰用slots,信号可选择。
connect(&,SIGNAL(xinhao()),this,SLOT())
4 qt4缺点是 SIGNAL和SLOT为宏,将函数名转换成字符串,编译不进行错误检查

8 Lambda表达式

1 c++11新特性,匿名函数对象
2 项目文件CONFIG+=C++11
3 connect(&b4,xinhao,b4mutable{ qDebug()})
=可加在[]外部所有局部变量、类中所有成员以值传递
this:类中所有成员以值传递
&:外部所有局部变量

9 内存回收机制

1 前提是指定父对象后
2 直接或间接继承与Qobject
3 前面两种情况满足,子对象如果是动态分配new,不需要手动delete,系统自动调用析构

10 菜单栏、工具栏

    //菜单栏
    QStatusBar *statusBar = statusBar();
    statusBar->addWidget(label);
    QMenuBar *mBar=menuBar();
    //添加菜单
	Qmenu *pFile=mBar->addMenu("文件")//添加菜单项,添加动作
    Qaction *pNew=pFile->addAction("新建");
    Connect(pNew,&Qaction::triggered,[=](){qDebug()<<"新建被按下";})
    //添加分割线
    pFille->addSeparator();
    //工具栏:菜单项的快捷方式
    QToolBar *toolBar=addToolBar("toolBar")//工具栏添加快捷键
    toolBar->addAction(pNew); 

11 状态栏、核心控件、浮动窗口

状态栏

    QStatusBar *statusBar = statusBar();
    statusBar->addWidget(label);

核心控件

    QTextEdit *textEdit  = new QTextEdit(this);
    setCentralWidget(textEdit);

浮动窗口

    QDockWidget *dock = new QDockWidget(this);
    addDockWidget(QT::RightDockWIdgetArea,dock);

12 模态与非模态

1 dialog.exec()模态
2 dialog.show 非模态

13 标准对话框、文件对话框

1 标准 QMessegeBox:关于about、问题question
2 文件对话框 QFileDialog

    Qstring s=QFileDialog::getOpenFileName(this,"open","../“,"source(*.cpp *.h);;Text(*.txt);;all(*.*)")

14 QT4与QT5

    //QT4
    Connect(button,SIGNAL(click()),this,SOLT(close()));
    //QT5
    Connect(button,&Qpushbutton::clicked,this,&widget::close);
    Connect(button,&Qpushbutton::clicked,
    [](){});

15 lambda构成

在这里插入图片描述
1 [],标识一个lambda的开始,=:值传递,&:引用传递
2 ()定义变量
3 变量可变,=时变量是const
4 异常
5 返回值

16 样式表

1 子部件,整个窗口,甚至整个应用程序
2 selector选择器:label.setStyleSheet("Qlabel:(color:red;)");

17 事件

1 鼠标,键盘,定时器
2 鼠标动作->转换成相应对象->交给event()函数->事件处理器 event()不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(switch)
3 事件可以理解为一个中断,处理完又回到正在处理的程序中
4 事件处理函数全是虚函数,保护类型
5 鼠标事件里有坐标函数x()y()
6 QString格式化Qstring("(%1,%2)").arg(e->x()).arg->y());
7 键盘事件 e->key() == QT::Key_A获取键盘键值

18 定时器事件

1 如幻灯片、闹钟一般
2 处理函数
3 id = startTimer(1)毫秒为单位;指定id开始
4 杀死定时器killTimer(id);

19 事件的忽略与接收

1 事件与信号,例鼠标按下事件与鼠标按下信号,结果是事件接收后,如果没继续调用事件,事件不会往下传,就不会发送click信号。
2 处理关闭窗口事件,接收事件e->accept(),事件不会往下传递,不关闭窗口,忽略事件e->ignore(),事件传递给父组件 。

20 Event函数

1 只要是控件继承于QWidget,就有event(),控件都有event(),我们只需重写
2 QEvent里面有事件的type
3 事件分发过程

    void MyWidget::event(Qevent *e)
    {
    	switch(e->type())
    	{
    		case QEvent::close;
    		closeEvent(e);
    		break;
    		case Qevent::MouseMove;
    		mouseMoveEvent(e);
    		break;
    	}
    }

4 让事件按原来进行return Qwidget::event(e);当对某一类事件特殊处理时。

21 事件过滤器

    bool eventFilter(Qobject *obj,Qevent *e)
    {
    	//
    }

1 事件先通过事件过滤器然后是事件操作
2 事件过滤器和被安装过滤器的组件必须在同一线程。
换句话说,多线程无效。

22 简单绘图

1 定义

    QPainter p;//画家
    p.begin(this);//指定设备
    p.drawPixmap(0,0,width(),height(),QPixmap("../bg.png"));
    p.end();

2 //画直线
//定义画笔/画刷(画笔可定义颜色等),把画笔/画刷交 给画家,然后画直线
Update()//间接调用paintEvent(),整个窗口都重绘,也可以指定范围
3 重写绘图事件,如果给窗口绘图,一定要在paintEvent()中
4 填充

    p.fillrect(0,0,0,0,Qbrush(Qt::white))//通过画家
    Pixmap.fill(Qt::white);//通过绘图设备

23 QPixmap与QBitmap

1 绘图设备:
Qbitmap 黑白
Qpixmap 彩色
2 区别:
Qpixmap:针对屏幕进行优化了,和平台相关
Qimage:和平台无关,可以对图片进行修改,在线程中绘图
Qpicture:保存绘图的状态(二进制文件)

24 绘图设备转换

    //pixmap
    //to Image
    Qpixmap temp = Qpixmap::fromImage(image)
    Qimage temp =pixmap.toImage();

25 不规则窗口

    //去窗口边框
    setWindowFlags(Qt::FramlessWindowHint | windowsFlages())
    //把窗口设置为透明
    setAttribute(Qt::WA TranslucentBackground)//设定属性

26 QFile

    Qstring path=QFileDialog::getOpenFileName(this,"open","../","TXT(*.txt)");
    If(!path.isEmpty()){Qfile file(path);//文件对象
    Bool isOK = file.open(QIODevice::ReadOnly);//打开文件
    If(isOK){
    //读文件,默认只识别utf-8
    QByteArray array = file.readAll();
    Ui->textEdit->setText(array);
    //第二种读文件方法
    QByteArray array;
    While(!file.atEnd())
    {
    //读一行
    array+=file.readline();
    }
    Ui->text->setText(array);
    }
    file.close();
    
    
    //写文件
    Qstring path=QFileDialog::getSaveFileName(this,"save","../","TXT(*.txt)");
    //只写方式打开
    //获取编辑区内容
    Qstring str = ui->textEdit->toPlainText();
    File.write(str.toUtf8());

27 QString to QByteArray

    QString buf;
    QByteArray a = buf.toUtf8();//中文
    A = buf.toLocal8Bit();//本地编码

28 QFileInfo获取文件信息

    QFileInfo info(QFile类型);
    Info.fileName();//名字
    Info.suffix();//后缀
    Info.size();//大小
    Info.created().toString("yyyy-MM-dd hh:mm:ss");
    //创建时间

29 QDataStream获取文件信息

    //QDataStream 文件流(音频视频)
    Void writeData()
    {
    QFile file("../test.txt");//文件对象
    //只写打开文件;
    QDataStream stream(&file);//创建数据流和io文件关联,往数据流中输入数据,相当于往文件里写数据
    Stream<<Qstring("")<<250;
    File.close();
    }
    Void readData
    {
    QFile file("../test.txt");//文件对象
    //只读打开文件;
    QDataStream stream(&file);//创建数据流和io文件关联,往数据流中输入数据,相当于往文件里读数据
    //读的时候,按写的顺序取数据
    QString str;
    Int    a;
    Stream>>str>>a;
    }
    Stream.setcodec();//编码

30 QBuffer

1 从内存缓冲区读取数据。
2 常用函数:write()//写入;buffer()//读取。

你可能感兴趣的:(QT,C++,读书笔记,QT)