当前位置:   article > 正文

UI--基本组件_qt ui组件介绍

qt ui组件介绍

1. Designer 设计师

Designer是一款独立的用于设计Qt界面的应用程序。

Designer程序保存的文件格式为.ui,这是Qt中的界面文件格式,可以非常快速的开发用户界面。

当使用Qt Creator新建项目时,如果在第五步,选中了创建界面的选项,这样的项目会自带一个.ui界面文件。

在Qt Creator中双击界面文件,可以直接通过内置的Designer程序打开。

Designer程序的区域划分如下图所示。

2. Layout 布局

可以把布局看做是一个“透明的盒子”,盒子内部存放的组件对象会按照这个盒子的规则自动排布,也可以把整个布局看做为一个复合组件。

布局有以下类型:

QVBoxLayout的特点是内部所有组件按照线性垂直排序,QHBoxLayout与QVBoxLayout几乎相同,只有方向不同,是水平方向的。

  当窗口中有一个布局时,可以选中窗口对象,点击工具栏任意一个布局按钮,此时可以让内部的布局贴合窗口,当窗口改变大小时,布局会在内测贴合窗口大小。选中贴合的窗口后,点击打破布局可以取消布局和窗口的贴合状态。

水平布局和垂直布局的常用属性如下:

布局支持嵌套使用,可以把一个布局看做另一个布局的子组件。

可以使用伸展器组件填充布局的空白。

3. 基本组件

3.1 QWidget

QWidget常用属性如下所示。

以上属性都可以继承给其派生类,每个属性的getter和setter详见文档,不再赘述。

3.2 ui指针

当项目中使用了界面文件时,可以在Dialog类中发现多了一个成员变量:

这个ui指针就是.ui界面文件与C++代码的桥梁,以下是ui指针的工作原理。

3.3 QLabel 标签(掌握)

QLabel组件用于显示文本或图片,常用属性如下。

如果要在项目中使用图片素材,需要先把图片导入到Qt项目中,图片格式建议使用jpg、png与bmp,图片命名建议使用全英文+数字+下划线的组合,且英文不得包含大写,数字不得开头。

图片导入项目的操作步骤如下:

1. 把图片放置到工作目录中。

2. 在Qt Creator中,选中项目名称,鼠标右键,点击“添加新文件”

3. 在弹出的窗口中,按照下图所示进行操作。

4. 在弹出的窗口中给资源文件命名后,点击“下一步”。

5. 在项目管理界面,直接点击“完成”。可以看到项目中多了一个.qrc资源文件。

6. 选中资源文件,点击 添加 --- 添加前缀

7. 再次选中资源文件,点击 添加 -- 添加文件

,在弹出的对话框中选择要导入的图片文件即可。可以看到图片被添加到资源文件中了。

8. 后续在代码中使用图片只需要选中资源文件中的图片文件,鼠标右键,点击“复制资源路径到剪切板”即可。如果要在Designer中使用,则需要再次构建一次项目

虽然Qt有图形处理的功能,但是尽量在Qt之外先处理好图片的效果,这样可以提升程序的执行效率,也能降低程序的体积。

另外,过大的图片(文件体积过大 或 分辨率过大)不要导入到Qt中,因为会明显地增加资源占用,甚至导致程序无法正常运行。

示例代码:

dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. // 头文件
  5. #include <QColor> // 颜色
  6. #include <QPalette> // 调色板
  7. #include <QPixmap> // 图片
  8. #include <QSize> // 大小
  9. namespace Ui {
  10. class Dialog;
  11. }
  12. class Dialog : public QDialog
  13. {
  14. Q_OBJECT
  15. public:
  16. explicit Dialog(QWidget *parent = 0);
  17. ~Dialog();
  18. private:
  19. Ui::Dialog *ui;
  20. };
  21. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :
  4. QDialog(parent),
  5. ui(new Ui::Dialog)
  6. {
  7. ui->setupUi(this);
  8. //以下用的是栈内存对象 用完自动销毁
  9. // 创建颜色对象
  10. // 可以使用三个十进制0-255的RGB数值
  11. // 也可以使用十六进制#字符串的方式
  12. QColor color("#340A55");
  13. QPalette pa; // 调色板对象
  14. // 调制颜色
  15. // 参数1:颜色角色
  16. // 参数2:颜色对象
  17. pa.setColor(QPalette::WindowText,color);
  18. // 访问到组件对象,设置调色板
  19. ui->labelText->setPalette(pa);
  20. // 创建一个大小对象 通过getter方法设置大小
  21. QSize size(ui->labelImg->width(),ui->labelImg->height());
  22. // 创建一个图片对象,参数是资源路径
  23. QPixmap pic(":/new/prefix1/duanwujie.jpg");
  24. // 缩放图片为目标尺寸
  25. // 参数1:尺寸对象
  26. // 参数2:缩放模式 共有三种模式
  27. // 返回值:缩放后的图片对象
  28. pic = pic.scaled(size,Qt::IgnoreAspectRatio);
  29. // 设置显示
  30. ui->labelImg->setPixmap(pic);
  31. }
  32. Dialog::~Dialog()
  33. {
  34. delete ui;
  35. }

3.4 QAbstractButton 按钮类(掌握)

QAbstractButton是四种按钮的基类,内部规定按钮的基础功能,在四个派生类中功能的展示不尽相同。这个四个派生类分别是:

  • QPushButton     点击式的命令按钮
  • QRadioButton    单选按钮,单选按钮会对同一个布局中的其它按钮增加互斥性。
  • QCheckBox       多选按钮
  • QToolButton      工具按钮

QAbstractButton的常用属性如下所示。

图标并不是普通的图片,图标具有以下特点:

  • 宽高比为1:1
  • 包含透明图层,通常使用png格式
  • 一个软件的图标应该保持同一种风格

图标可以通过阿里巴巴矢量图标库下载。

按钮类的信号函数如下所示。

示例代码:

dialog.ui

dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. #include <QDebug>
  5. namespace Ui {
  6. class Dialog;
  7. }
  8. class Dialog : public QDialog
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Dialog(QWidget *parent = 0);
  13. ~Dialog();
  14. private:
  15. Ui::Dialog *ui;
  16. private slots:
  17. void btnImgPressedSlot(); // 按钮按压
  18. void btnImgReleasedSlot(); // 按钮释放
  19. void checkBoxQtToggledSlot(bool); // 选中状态改变
  20. };
  21. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :
  4. QDialog(parent),
  5. ui(new Ui::Dialog)
  6. {
  7. ui->setupUi(this);
  8. connect(ui->btnImg,SIGNAL(pressed()),
  9. this,SLOT(btnImgPressedSlot()));
  10. connect(ui->btnImg,SIGNAL(released()),
  11. this,SLOT(btnImgReleasedSlot()));
  12. connect(ui->checkBoxQt,SIGNAL(toggled(bool)),
  13. this,SLOT(checkBoxQtToggledSlot(bool)));
  14. }
  15. void Dialog::btnImgPressedSlot()
  16. {
  17. qDebug() << "按下去了!";
  18. }
  19. void Dialog::btnImgReleasedSlot()
  20. {
  21. qDebug() << "抬起来了!";
  22. }
  23. void Dialog::checkBoxQtToggledSlot(bool checked)
  24. {
  25. if(checked)
  26. qDebug() << "今晚复习Qt!";
  27. else
  28. qDebug() << "今晚不复习Qt!";
  29. }
  30. Dialog::~Dialog()
  31. {
  32. delete ui;
  33. }

运行结果:

当界面中按钮对象较多时,为每个按钮设置信号槽连接比较繁琐。此时可以使用QButtonGroup类同时管理多个按钮对象。

QButtonGroup不继承QWidget类,直接继承QObject类,因此没有任何视觉效果,只是一种逻辑上的分组,因此也不属于ui指针,需要手动管理堆内存对象的生命周期。

QButtonGroup的信号函数如下。

每种信号提供了两种参数格式,分别是接收按钮对象本身或按钮对象的编号。

示例代码:

dialog.ui

dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. //头文件
  5. #include<QButtonGroup>
  6. #include<QDebug>
  7. namespace Ui {
  8. class Dialog;
  9. }
  10. class Dialog : public QDialog
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit Dialog(QWidget *parent = 0);
  15. ~Dialog();
  16. private:
  17. Ui::Dialog *ui;
  18. QButtonGroup *group;//按钮组对象
  19. private slots:
  20. //信号:void buttonToggled(int id, bool checked)
  21. void btnsToggledSlot(int,bool);
  22. };
  23. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :
  4. QDialog(parent),
  5. ui(new Ui::Dialog)
  6. {
  7. ui->setupUi(this);
  8. group=new QButtonGroup(this);//Fn+F1-->Public Functions
  9. //给按钮组添加按钮对象
  10. //参数1:要添加的按钮对象
  11. //参数2:按钮组内编号 使用不重复的正整数
  12. group->addButton(ui->checkBoxCHN,1);
  13. group->addButton(ui->checkBoxUSA,2);
  14. group->addButton(ui->checkBoxJAN,3);
  15. //解除同组互斥性
  16. group->setExclusive(false);
  17. //连接槽函数
  18. connect(group,SIGNAL(buttonToggled(int,bool)),
  19. this,SLOT(btnsToggledSlot(int,bool)));
  20. }
  21. void Dialog::btnsToggledSlot(int id,bool checked)
  22. {
  23. if(id == 1)
  24. qDebug()<<"中国:"<<checked;
  25. else if(id==2)
  26. qDebug()<<"美国:"<<checked;
  27. else if(id==3)
  28. qDebug()<<"日本:"<<checked;
  29. }
  30. Dialog::~Dialog()
  31. {
  32. delete ui;
  33. }

运行结果:

3.5 QLineEdit 单行文本输入框(掌握)

QLineEdit用于录入用户的整行文本输入。

常用属性如下。

信号函数如下。

示例代码:

dialog.ui

 dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. #include<QDebug>
  5. namespace Ui {
  6. class Dialog;
  7. }
  8. class Dialog : public QDialog
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Dialog(QWidget *parent = 0);
  13. ~Dialog();
  14. private:
  15. Ui::Dialog *ui;
  16. private slots:
  17. void btnClickedSlot();//点击按钮的槽函数
  18. void textEditedSlot(QString);//编辑的槽函数
  19. };
  20. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :
  4. QDialog(parent),
  5. ui(new Ui::Dialog)
  6. {
  7. ui->setupUi(this);
  8. connect(ui->pushButton,SIGNAL(clicked()),
  9. this,SLOT(btnClickedSlot()));
  10. connect(ui->lineEditPwd,SIGNAL(textEdited(QString)),
  11. this,SLOT(textEditedSlot(QString)));
  12. }
  13. void Dialog::btnClickedSlot()
  14. {
  15. //获取用户名的输入内容输出
  16. QString user=ui->lineEditUser->text();
  17. qDebug()<<user;
  18. }
  19. void Dialog::textEditedSlot(QString text)
  20. {
  21. qDebug()<<text;
  22. if(text.size()==0)
  23. {
  24. ui->lineEditPwd->setText("ABC");
  25. }
  26. }
  27. Dialog::~Dialog()
  28. {
  29. delete ui;
  30. }

运行结果:

3.6 QComboBox 组合框

QComboBox在某种程度上可以代替QRadioButton,它是一个下拉选项框。

在Qt Creator中,有两个词都被翻译为“项目”:Project、Item

Project指的是一个工程项目,Item指的是一个条目。

QComboBox的常用属性如下所示。

信号函数如下所示。

示例代码:

dialog.ui

 dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. #include<QDebug>
  5. namespace Ui {
  6. class Dialog;
  7. }
  8. class Dialog : public QDialog
  9. {
  10. Q_OBJECT
  11. public:
  12. explicit Dialog(QWidget *parent = 0);
  13. ~Dialog();
  14. private:
  15. Ui::Dialog *ui;
  16. private slots:
  17. //高光悬停
  18. void highlightedSlot(QString text);
  19. };
  20. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :
  4. QDialog(parent),
  5. ui(new Ui::Dialog)
  6. {
  7. ui->setupUi(this);
  8. connect(ui->comboBox,SIGNAL(highlighted(QString)),
  9. this,SLOT(highlightedSlot(QString)));
  10. }
  11. void Dialog::highlightedSlot(QString text)
  12. {
  13. qDebug()<<text;
  14. }
  15. Dialog::~Dialog()
  16. {
  17. delete ui;
  18. }

运行结果:

3.7 一组与数值相关的组件

以下组件的核心功能都是与数字相关。

以上组件具有一些相同的属性(浅灰色为部分组件有效的属性):

以上组件最常用的信号函数:

  1. // value值发生变化时发射
  2. void valueChanged(int value) [signal]

示例代码:

dialog.ui 

dialog.h

  1. #ifndef DIALOG_H
  2. #define DIALOG_H
  3. #include <QDialog>
  4. namespace Ui {
  5. class Dialog;
  6. }
  7. class Dialog : public QDialog
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit Dialog(QWidget *parent = 0);
  12. ~Dialog();
  13. private:
  14. Ui::Dialog *ui;
  15. private slots:
  16. //QDial的value值变化时发射信号连接的槽函数
  17. void valueChangedSlot(int);
  18. };
  19. #endif // DIALOG_H

dialog.cpp

  1. #include "dialog.h"
  2. #include "ui_dialog.h"
  3. Dialog::Dialog(QWidget *parent) :
  4. QDialog(parent),
  5. ui(new Ui::Dialog)
  6. {
  7. ui->setupUi(this);
  8. connect(ui->dial,SIGNAL(valueChanged(int)),
  9. this,SLOT(valueChangedSlot(int)));
  10. }
  11. void Dialog::valueChangedSlot(int value)
  12. {
  13. //同步给其他组件对象
  14. ui->spinBox->setValue(value);
  15. ui->progressBar->setValue(value);
  16. ui->horizontalScrollBar->setValue(value);
  17. ui->horizontalSlider->setValue(value);
  18. ui->verticalScrollBar->setValue(value);
  19. //ui->verticalSlider->setValue(value);//默认从下向上滑动
  20. ui->verticalSlider->setValue(100-value);//从上向下滑动
  21. }
  22. Dialog::~Dialog()
  23. {
  24. delete ui;
  25. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/109827
推荐阅读
相关标签
  

闽ICP备14008679号