Qt学习02

一、信号和槽
1、什么是Qt的信号
当用户或者系统满足一定条件或触发某些动作时,导致窗口或者控件、类发生一些改变时,它们就会发射出一个对应的信号。
信号可以预先连接一个特殊的函数,当信号被触发时,就会自动调用该函数,这样的函数就称为槽函数
例如:QPushButton中的单击信号clicked信号
2、槽函数
与普通函数一样,也可以被手动调用,但是一般不会这样调用,而是通过连接信号后,由信号来自动触发
3、信号和槽的连接
信号和槽必须建立connect连接后,才会触发槽函数
QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)
sender:信号的发出控件,必须是QObject的子类,例如QPushButton
signal:要连接的信号的签名
通过SIGNAL(信号名()) 把信号转换成信号签名
receiver:信号的接受者,必须是QObject的子类
method:要绑定的槽函数的签名
通过SLOT(槽函数()) 把槽函数转成槽函数签名

    connect函数属于QObject的公开成员函数:
        如果在类外调用,需要声明QObject::connect
    QObject::connect(but,SIGNAL(clicked()),&w,SLOT(on_pB_clicked()));

    注意:如果在Qt设计师中通过右击控件->转到槽->选择要绑定的信号->会在控件所属的主窗口中自动生成一个已经connect的槽函数

4、自定义信号和槽函数
    1、给项目添加一个新的类,一定要继承QObject
        右击项目名->添加新文件->C++ Class->写类名 一定要选择继承QObject
    2、在signals:下面定义信号
    3、在public slots:下面声明自定义的槽函数,并在源文件中实现该槽函数的功能
    4、使用connect连接信号和槽
        类自己发射自定义信号,执行自己的槽函数
        类自己发射自定义信号,执行其它类的槽函数
        其它类或控件发射信号,执行类自己的槽函数
    5、类发生自定义信号方式
        在类内、外直接调用信号函数,相当于发射了该信号
        或在类内通过 emit函数 声明发射了信号
    
    总结:如果自定义的类需要用到自定义信号或者槽函数,该类必须
        1、继承QObject
        2、类的开头位置一定要有Q_OBJECT

二、在Qt创建器中是如何使用xxx.ui文件
以主窗口为 QWidget 为例
1、widget.ui文件会被Qt界面编译器翻译成ui_widget.h文件,该文件会放入项目的编译路径中
2、在ui_widget.h文件中会自动生成一个Ui_Widget类,该类中会自动根据Qt设计师中的控件来添加对应的控件对象
3、Ui_Widget类中,有一个成员函数setupUi,该函数的参数是主窗口对象指针,并且该函数中会实例化所有的控件并放入主窗口中,设置相应的属性(大小、位置、文本名等)
4、ui_widget.h文件中定义了一个Ui的名字空间,并且在Ui名字空间中定义了一个Widget空类,继承了Ui_Widget类(本质上Widget类就是Ui_Widget类)
5、Qt创造器会自动生成widget.h\widget.cpp,并生成一个属于匿名名字空间的Widget类
6、在widget.h文件中,自动添加Ui名字空间的声明,并且在主窗口类Widget中,自动添加一个成员变量:Ui::Widget* ui;
7、在widget.cpp中,会自动生成Widget类的构造函数和析构函数,并且在构造函数中的初始化列表中,实例化了ui对象,并且在析构函数中delete ui
8、并且在构造函数中自动执行了ui->setupUi(主窗口对象),完成了ui设计师中所有控件的定义、初始化

总结:如何通过代码使用Qt设计师中定义的控件
    在主窗口类中通过 ui->控件名->控件的成员函数() 来对设计师中创建的控件进行操作 

三、主窗口的属性设置
1、设置窗口的大小
1、鼠标拖拽
2、设置geometry属性
x坐标、y坐标 无法设置
宽度、高度
3、代码中设置
move、resize函数
2、设置窗口的标题
1、通过属性windowTitle
2、通过代码 setWindowTitle 函数
注意:控件对象名.set属性名() 一般用于设置该属性值
控件对象名.属性名() 一般用于获取该属性的值
3、设置窗口的最大、最小尺寸
minxxx
maxxxx
当设置了最大尺寸后,最大化的按钮失效了
当最大、最小尺寸设置相同,窗口大小将被固定,有利于内部控件的布局设置
4、设置窗口的文本字体、字号
通过font属性设置,如果设置了主窗口的字体,属于该主窗口的所有控件会一起生效

四、控件的常用设置
1、控件位置、大小
1、鼠标拖拽
2、设置geometry属性
x坐标、y坐标 无法设置
宽度、高度
3、代码中设置
move、resize函数
4、通过键盘微调
1、方向键以10px为单位移动
2、Ctrl+方向键 以1px为单位移动
3、Shift+方向键以10px为单位,伸缩控件,位置不变
4、Shif+Ctrl+方向键以1px为单位,伸缩控件,位置不变
2、控件的文本对齐
设置alignment属性,水平、垂直对齐
3、通过font设置字体
4、通过objectName属性,修改控件在代码中的对象名
一般不建议使用系统自动生成的名字,因为当界面变得复杂后,这种名字就很难使用,一般建议改名

五、Qt中控件的分类
Laytous、Spacers 用于界面的自动布局
Buttons 按钮类控件
Item View 小型项目数据的容器,只有模型,而没有数据结构,需要使用者自己创建数据结构
Item Widget 小型项目数据的容器,模型和数据结构都有了,只需要放入数据即可
Containers 窗口容器,用于在里面放入属于该容器的控件,一般可以进行单独局部布局
Input Widgets 输入相关的控件
Display Widgets 显示相关控件

六、界面布局设置
1、绝对定位
固定窗口的最大、最小尺寸相同,让界面无法调整大小,里面的控件的位置、大小都无需发生变化
需要手动计算每个控件一开始的位置、大小
2、相对定位
当窗口大小发生变化时,内部控件可随之发生变化,称为相对定位
当主窗口大小发生变化时,会自动调用一个父类QWidget中虚函数
virtual void resizeEvent(QResizeEvent *);
默认情况下,窗口大小改变时,只执行父类中的啥都不干的虚函数,如果我们想要监控窗口大小是否发生改变,需要把该虚函数覆盖实现即可
在resizeEvent函数中:
this->width(); 获取主窗口的宽度
this->height(); 获取主窗口的高度
ui->控件名->width(); 获取控件的宽度
ui->控件名->height(); 获取控件的高度
ui->控件名->x(); 获取控件的x坐标
ui->控件名->y(); 获取控件的y坐标
ui->控件名->move(x,y); 设置控件的位置
ui->控件名->resize(w,h); 设置控件的大小
3、自动布局
1、主窗口改变布局样式
a、添加一个自动布局控件layouts,激活主窗口的自动布局
b、选中主窗口->右击->布局->选择自动布局样式
c、删除自动布局控件
d、通过Layout属性设置自动布局的边距、控件之间空隙、每个控件的比例
2、子窗口中自动布局
a、选中要自动布局的控件,右击->选择自动布局
b、向主窗口添加一个新的子窗口Widget,向子窗口进行自动布局操作

七、Button按钮类控件
1、QPushButton
1、enabled属性,决定按钮是否能点击
setEnabled(false); 设置是否能点击
isEnabled(); 获取是否能点击
2、设置 text属性,设置按钮显示的文字、图标
ui->pushButton_2->setText("hehe");
QIcon qic("file.png");//该文件需要放入项目的编译路径
ui->pushButton_2->setIcon(qic);
3、常用的信号
clicked() 单击信号
clicked(bool) 单击信号并获取按钮状态
需要勾选checkable属性该信号才有意义,获取按钮是按下还是抬起状态
pressed() 按下按钮信号
released() 松开按钮信号
toggled() 按钮状态改变信号
注意:无论是单击或者通过代码改变按钮的状态,都会触发该信号
2、QToolButton
是QPushButton的子类,可以有自带一些图标
3、QRadioButton
单选按钮,在同一个小组控件内,只能有一个单选按钮被选中
4、QCheckBox
多选按钮,可以同时多选
tristate属性勾选,该按钮有三种状态
void stateChanged(int arg1)
当状态改变时触发信号,并获取是哪种状态
5、QDialogButtonBox
组合按钮,同意类、拒绝类、帮助类按钮的自由组合
不同类的按钮会触发对应的信号
clicked(QAbstractButton *button)
单击信号,并且能够通过QAbstractButton类获取单击的是哪个按钮
button->text()

八、Item Widget控件
1、QListWidget
以链表实现出来的数据结构,里面存储的是QListWidgetItem类型
添加数据:
1、先准备一条QListWidgetItem数据
QIcon ico("file.png"); //准备图标对象
QListWidgetItem* item =
new QListWidgetItem(ico,"数据内容",ui->listWidget);
2、向链表中添加一条已经创建的数据
ui->listWidget->addItem(item);

    删除数据:
    ui->listWidget->takeItem(下标);//删除该下标数据
    查询数据:
    ui->listWidget->currentItem()->text();//获取选中的数据的内容
    常用信号:
    clicked(const QModelIndex &index)
    单击数据行信号 index里面存储了被单击的行的信息
        例如index.row()获取被点击的行数

2、QTreeWidget
    底层是以树型结构的数据结构,存储的是QTreeWidgetItem类型的数据
    QTreeWidget需要先设置列数、列名后才能使用
    //  设置列数
    ui->treeWidget->setColumnCount(3);
    //  依次批量设置每列名字
    ui->treeWidget->setHeaderLabels(
   QStringList()<<"名字"<<"日期"<<"权限");

    //   准备一条数据,放入树结构中
    QTreeWidgetItem* item =
    new QTreeWidgetItem(ui->treeWidget);
    //  修改该数据的文本、图标等
    item->setText(0,"文件1");   //该第0列的文本
    item->setText(1,"2023-9-18");
    item->setText(2,"rwx-rwx");
    item->setIcon(0,ico);

    //  添加子树数据
    //  创建一条空白数据
    QTreeWidgetItem* item =
        new QTreeWidgetItem;
    //  修改该数据的内容
    item->setText(0,"sub1");
    item->setText(1,"111-111");
    //  获取想要加入的父节点数据,往该节点添加子树数据
    ui->treeWidget->currentItem()->addChild(item);
posted @ 2023-09-22 19:33  优秀还天籁  阅读(24)  评论(0编辑  收藏  举报