Qt笔记,平时学习的笔记

一、
1、Qt通过内省数据的使用而启用了许多现代许多现代语言特性,从而丰富了C++,通过QObject基类实现的使得我们可以动态获取对象的属性和方法
2、Qt使用元信息(Meta 上一层C++)来支持信号和插槽机制(非常松散的回调)发出的信号不需要知道拥有槽的对象的任何信息,信号可以连接任意数量的插槽,也可以链接其他信号。
C++相关书籍: primer C++ 讲的是C++基础 、efficient C++ 、more  、 efficient  C++ 、C++对象模型 、设计模式
3、Qt安装 只安装需要的组件 后期可以添加删除  MaintenanceTool.exe  

4、实操:想运行控制台项目  在左侧  项目Projects   -》看到 Run   ->早右侧可以 选择 在终端运行(Run in terminal)
5、该项目名  在文件夹找到 自己的项目 重命名项目-》 进去文件夹 打开CMakeLists.txt  更改里面的 的 项目名称改成新命名的项目名称 ,再用Creator 开到项目  选择CMakeLists.txt文件开到  选择自己配置的 MinGW  Confing Project  才能运行(可以把 CMakeLists.txt.user文件删除)
6、Options 在工具栏Tool  >外部  (Options  E环境)>配置   环境的字体  颜色的设置
7、在自己的项目加入  其他依赖库   在CMakeLists.txt 添加   但是要注意换成自己的名称

               find_package(Qt6 REQUIRED COMPONENTS Charts)  
               target_link_libraries(mytarget PRIVATE Qt6::Charts)
二、Qt主事件循环
QT框架  :
                         QObject
                              ↑
                          QCoreApplication   为非GUI应用程序提供主事件循环  (如控制台程序)
                              ↑
                         QGuiApplication      为GUI应用程序提供主事件循环
                              ↑
                          QApplication           为Qt Widgets模块的应用程序提供主事件循环

QCoreApplication包含 主事件循环, 处理和分发来自操作系统和其他源文件的所有事项 还处理程序初始化和终结,以及系统范围和应用程序范围的设置   想退出程序可以用exit 并且传递给exit()的返回值
三、元对象系统(moc与QObject)
1、Qt对标准C++进行了拓展,引入了一些新概率和功能
信号和槽
属性
内存管理 :我删除了父节点,子节点可以一起回收
2、QObject类是所有使用元对象系统类的基类
并不是所有Q开头的类都是Object的派生类,例如QString
在一个类的private 部分声明 Q_OBJECT宏
3、MOC(Mate  Object Compiler 元对象编译器,其实是一个预处理编译器)为每个QOBject的子类提供必要的代码   Q_OBJECT宏一般放在类的最上面
MOC 将Qt特性程序转换为标准 C++程序,再由标准C++程序执行编译

使用信号和槽的时候,只有添加Q_OBJECT宏,moc才能对类的信号和槽进行预处理
4、QT为C++添加的新语言特性,在Qt Core 模块中实现,有QT的元对象系统实现 包括 信号与槽机制,属性系统,动态类型转换等。

5、元对象系统是C++拓展,使该语言更适合真正的组件化GUI编程

6、源代码-> 预处理
         QOBJECT宏↓    编译器->链接器->应用程序                                
                        moc↗        
c++源代码 只有继承了QOBJECT  祖类 并且在类中声明了Q_OBJECT宏才能调用moc 预编译器会产生moc前缀的文件,再通过链接器,最后生成.exe文件

7、QObject是Qt对象模型的核心,标准的c++对象某些领域不够灵活。QObject提供了灵活性,C++是静态语言
8、QObject 不支持拷贝(重点)为什么? 因为QObject的拷贝构造函数和赋值运算符都是私有的,并且使用了Q_DISABLE_COPY()宏,因为Q_Object 做了太多的东西,如果支持拷贝的话需要很多考虑的地方,要考虑副本的东西比较多所有直接用 指针
9、QObject在对象树中组织自己
当以另外一个对象作为父对象创建QObject时,该对象将自动将自身添加到父对象的子对象列表中
当父类对象删除时候,它将自动删除其子对象,可以使用findChild()或者findChildren()按名称和可选择类型查找对象
10、如果只需要通过QObject自动回收内存,无需moc,也就无需添加Q_Object宏,如果不是必须但是加上好。

四、事件和信号
GUI都是事件驱动的,事件由应用程序的用户生成,也可以通过其他方式产生,例如Internet链接、窗口管理器或者计时器,当调用exec()时,应用程序进入主循环,主循环获取事件将其送到对象

几种信号和槽的方式
1、使用成员函数指针:
 优点:1、允许编译器检查信号与槽的参数兼容,2、编译器可以隐式转换参数
connect(sender,&QObject::destroy,this,&MyObject::ObjectDestroy);
2、使用仿函数或者lambda表达作为slot
connect(sender,&QObject::destroy,this,[=]( )){this->m_object.remove(sender); });
3、使用SINGAL 和 SLOT宏
如果参数具有默认值,传递给SINGAL()宏的签名的参数不得小于SLOT()宏的参数 ,就是SLOT()如果要参数的话必须SIAL必须给,至于SINAL()有几个参数不用管,
1、connect(sender, SlGNAL(destroyed(Q0bject*)), this, SLOT(objectDestroyed(Qbject*));
2、connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed()));  
3、connect(sender, SlGNAL(destroyed()),this, SLOT(objectDestroyed()));
4、信号和槽还有一种自动关联方式,例如on_pushButtonclicked(),uic自动生成的setupUi()函数中调用connectslotByName()函数

//运行时错误 : onnect(sender, SIGNAL(destroyed(),this, SLOT(objectDestroyed(QObject*)));//运行时错误 ,因为SLOT需要参数,而SIGNL没有穿给SLOT
4、在多线程的时候connect还可以添加Qt::ConnectType 类型的参数,表示信号和槽之间的关联:
 static QMetaObject::Connection
connect(const QObiect *sender. const char *sianal.
                                 const QObject *receiver, const char *member, Qt::.ConnectionType = Qt::AutoConnection)

ConnectionType = Qt::AutoConnection(缺省值) 自动确认关联方式
                             = Qt::DirectConnection               信号被发射时,槽立即执行,槽函数和信号在同一个线程
                             = Qt::QueuedConnection            事件循环,回到接收者线程后执行槽,槽与信号在不同线程
                             = Qt::BlockingQueueonnection  与Qt::QueuedConnection相似,信号线程会被阻塞直到同一线程会造成死锁。

在槽函数里,使用Q0bject::sender()可以获取信号发射者的指针   QSpinBox *spinbox=qobject cast<QSpinBox *>(sender());

五、自定义信号和槽
Sender类:
class Sender : public QObject  //必须直接或者间接继承QObject 而且要有Q_OBJECT才能触发moc,signals:
{
    Q_OBJECT
public:
    explicit Sender(QObject *parent = nullptr);

private:
    int  m_age = 10;
public:

 void Sender::addAge()
{
    m_age++;
    emit ChangeAge(m_age);  //发送出去
}

signals:
    void ChangeAge(int value);  //信号函数必须没有返回值,可以有参数,信号无需实现,只需要在某些条件下触发。

};
Receiver类:

#include "receiver.h"
#include "qstring.h"
//#include "qdebug.h" //想用qDebug不行
#include <QDebug>  //才行

Receiver::Receiver(QObject *parent)
    : QObject{parent}
{


}

void Receiver::changeAdd(int age)
{
    qDebug()<<"Age:"<<age;
}

main中使用;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Sender senderObj;
    Receiver receiverObj;
    senderObj.addAge();
    QObject::connect(&senderObj,&Sender::ChangeAge,&receiverObj,&Receiver::changeAdd);

     senderObj.addAge();
     senderObj.addAge();
   //  receiverObj.~Receiver(); //可以断开链接
     QObject::disconnect(&senderObj,&Sender::ChangeAge,&receiverObj,&Receiver::changeAdd);//也可以断开链接
     senderObj.addAge();


   // return a.exec();
}

六、鼠标键盘响应
七、控件和自定义槽
八、属性系统
要声明 属性,请在继承Object的类中使用Q_PROPERTY()宏
Q_PROPERTY()宏定义一个返回类型为type,名称为name的属性

九、QString
十、容器
学习的顺序1、数据结构与算法 2、C++标准库:容器 3、Qt里的容器

QList、QSet、QMap
两种容器顺序容器和关联容器  Qt6 里面 的QVevtor QList和并了,QVevtor 是QList的别名。
  顺序容器:(sequence)是一个接一个地存储项目  :比如 1 2 3 4 6 内存挨着一起的,也有可能 串联一起的链式方式串在一            sequence只有按照算法的时候才能有顺序的不是自动的东西                    
                                                                    起的  或者我换成  1 2 5 3 6 也是一种顺序  
  而有序呢:是Ordered就是输入的 数字不排序,但是它会给你排序 比如输入 1 3 5 2 6,这个容器输出就是1 2 3 4 5 6  ,这个有序容器会按照某些指定规则排序
 
  QList 、QVector(在qt6中、QVector是QList别名)
 关系容器:存储键值对 QSet、QMap
QSet 是无序的容器:用Key hash 算法 找到对应的值,只有Key    QSet<QString> cols1 = {"yellow", "red","blue"};
QMap 是通过<key,value>     QMap<QString,int>items ={{"coins",5}, {"books",3}}; 创建
十一、日期和时间
Qt6有QDate、QTime和QDateTime类来处理日期和时间。
QDate:用于处理日期的类。
QTime:用于时钟时间的类。
QDateTime:将QDate和QTime对象组合到一个对象中的类
十二、QFile

QlODevice->QFileDevice->QFile
QFile是一种输入/输出设备,用于读取和写入文本、二进制文件和资源。
QFile可以单独使用也可以与QTextStream或aDataStream一起使用。

 十三、QDir


/***当前目录和其他特殊路径QDir的许多静态函数提供了对一些常见目录的访问:****/

QDir                                      QString                                     Return Value

QDir                                    currentPath()                           The application's working directory    //Project -> Run->  可以看到

home()                                homePath()                              The user's home directory   //电脑 user用户路径

root()                          rootPath()                    The user's home directory()

temp()                            tem pPath()                    The system's temporarydirectory    
           
setCurrent():设置应用程序的工作目录。
QCoreApplication::applicationDirPath():查找包含应用程序可执行文件的目录
drives():提供根目录列表。

十四、QFileInfo

QFilelnfo:独立于系统的文件信息,包括文件的名称和在文件系统中位置、访问时间和修改时间、权限或文件所有权。

十五、Gui

十六、使用样式表自定义界面
Qt样式表(style sheet)与HTML的css(Cascading Style Sheets)类似,是纯文本的格式定义。

1、现在工作目录中 建一个myStyle.css(.qss) 都行。
2、myStyle里面
   QWideget为选择器,表明后面花括号里的样式声明应用于QWidget


QWidget
                {
                 background-color:rgb(79, 79,79);
                 color:rgb(235,235,235);
                  font: 12pt"新宋体";
                 }

声明部分:每个样式法则由属性和值组成

选择器                                                       例子                                            用途
通用选择器                                                                                              *                                            所有组件
类型选择器                                                                                              QPushButton                                    所有QpushButton类及其子类的组件
非子类选择器                                                .QPushButton                                不包含子类
ID选择器                                                                   QPushButton#btnOK                                                   objectName为btnOK的QpushButton实例
从属对象选择器                                                                                       QDialog QPushButton                                                  所有从属与QDialog的QPushButton类的实例
子对象选择器   (只能子对象孙子不行)                            QDialog->QPushButton                         

3、在w.show 之前加载文件进来,
QFile stylefile("mystyle.css");
stylefile.open(QIoDevice::Readonly);
QString stylesheet = Qstring::fromLatinl(stylefile.readAll());a.setstyleSheet(stylesheet);


//这是mystyle.css里面的内容。
QWidget{
        background-color:rgb(79, 79,79);
        color:rgb(235,235,235);
        font: 12pt"新宋体";
        }
//给 QSpin添加图片
QSpinBox::down-button{image:url(:qrc:/C:Users/PC/Pictures/small.jpg);}
QSpinBox::up-button {image:url(:qrc:/C:Users/PC/Pictures/small.jpg);}
//鼠标按钮在上面可以 变颜色
QPushButton:!hover{
        background-color:black;
        color:yellow;
           }

//按钮样式
QPushButton{
min-width:60px;
min-height:60px;
padding:0px 10px 0px 10px;
border:2px groove red;
border-radius:30px;
}


可以在Qt的帮助文档中査找“Qt Style sheets Reference参看所有属性的详细说明
十七、通过按钮,加减QLabel的数字

十八、无边框透明背景
setWindowFlag(Qt::FramelessWindowHint);// 设置窗口无边框,设置后窗口无法移动setAttribute(Qt::WA TranslucentBackground, true);
border-image:url(:/images/button.png);//按钮样式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值