Qt:可视化UI设计

2023-11-13

1、创建项目&修改组件的对象名字和显示文本内容

创建一个 Widget Application 项目类 QDialog,在创建窗体时选择基类 QDialog,生成的类命名为 QWDialog,并选择生成窗体。

在界面设计时,对需要访问的组件修改其objectName,比如各个按钮,需要读取输入的编辑框,需要显示结果的标签等,以便在程序里区分。对于不需要程序访问的组件则无需修改其 objectName,如用于界面上组
件分组的 GroupBox、Frame、布局等,让 UI 设计器自动命名即可。

  • objectName是窗体上创建的组件的实例名称,必须唯一,因为程序访问组件是通过objectName进行访问的。
  • 窗体的 objectName 就是窗体的类名称,在 UI 设计器里不要修改窗体的 objectName,窗体的实例名称需要在使用窗体的代码里去定义。

2、界面组件布局

2.1、界面组件的层次关系。

使用容器类:如 QgoupBox、QtabWidget、QFrame 等。

例如,将 3 个 CheckBox 组件放置在一个 GroupBox 组件里,该 GroupBox组件就是这 3 个 CheckBox 的容器,移动这个 GroupBox 就会同时移动其中的 3 个 CheckBox:在窗体上放置了2个GroupBox组件,在groupBox1里放置 3 个 CheckBox 组件,在 groupBox2 里放置 3 个 RadioButton 组件

2.2、布局管理

2.2.1、组件面板中的Layouts和Spacers

2.2.2、工具栏:调整设计器进入不同的状态,进行布局设计。

单击需要布局的组件,然后点击布局按钮

  • 在窗体上选中组件时Ctrl可以实现组件多选
  • 选择容器内组件,相当于选择了其内部的所有组件

此时,选中两个groupBox,点击Lay Out Horizontally,实现水平布局

 

3、信号与槽

槽就是一个函数:槽函数可以和一个信号关联,当信号被发射时,关联的槽函数被自动执行。

信号与槽关联是用 QObject::connect()函数实现的,其基本格式是:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

connect()是QObject类的一个静态函数,而QObject是所有Qt类的基类,在实际调用时可以忽略前面的限定符,所以可以直接写为:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot())); 

其中:

  •  sender 是发射信号的对象的名称,
  •  signal()是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。
  •  receiver 是接收信号的对象名称
  •  slot()是槽函数的名称,需要带括号,有参数时还需要指明参数。

SIGNAL和STOT是Qt的宏,用于指明信号与槽,并将他们的参数转换为相应的字符串。

(1)一个信号可以连接多个槽,例如:

connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(addFun(int)); 
connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int)); 
  • 这是当一个对象 spinNum 的数值发生变化时,所在窗体有两个槽进行响应,一个 addFun()用于计算,一个 updateStatus()用于更新状态。
  • 当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。
  • 当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型,但可以不写参数名称。

(2)多个信号可以连接同一个槽

例如在本项目的设计中,让三个选择颜色的 RadioButton的 clicked()信号关联到相同的一个自定义槽函数 setTextFontColor()。

connect(ui->rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor())); 
connect(ui->rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor())); 
connect(ui->rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor())); 

这样,当任何一个 RadioButton 被单击时,都会执行 setTextFontColor()函数。

(3)一个信号可以连接另外一个信号

例如:

connect(spinNum, SIGNAL(valueChanged(int)), this, SIGNAL (refreshInfo(int)); 

这样,当一个信号发射时,也会发射另外一个信号,实现某些特殊的功能。


(4)严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。
(5)在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT
(6)当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。
        只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码

4 可视化生成槽函数原型和框架

下面开始设计程序功能。对于该程序,希望它的功能如下。

  • 单击 UnderLine、Italic、Bold 3 个 CheckBox 时,根据其状态,设置 PlainTextEdit 里的文字的字体样式;
  • Black、Red、Blue 3 个 RadioButton 是互斥选择的,单击某个 RadioButton 时,设置文字的颜色;
  • 单击“确定”“取消”或“退出”按钮时,关闭窗口,退出程序。

4.1、字体样式设置

选中chkBoxUnder 组件---->“Go to slot…”,出现下面的对话框:列出了QCheckBox类的所有信号,第一个是clicked(),第2个是带bool参数的clicked(bool)

  • 信号clicked():需要在代码中读取CheckBox组件的选中状态
  • 信号号 clicked(bool):将CheckBox组件当前的选择状态作为一个参数传递,在响应代码中可以直接利用这个传递的参数

选择 clicked(bool),然后单击“OK”按钮,在 QWDialog 的类定义中,会在 private slots 部分自动增加一个槽函数声明,函数名是根据发射对象及其信号名称自动命名的。

void on_chkBoxUnder_clicked(bool checked); 

同时,在 qwdialog.cpp 文件中自动添加了函数 on_chkBoxUnder_clicked(bool)的框架。添加代码

void QWDialog::on_chkBoxUnder_clicked(bool checked)
{
    QFont font = ui->txtEdit->font();
    font.setUnderline(checked);
    ui->txtEdit->setFont(font);
}

以同样的方法为 Italic 和 Bold 两个 CheckBox 设计槽函数,编译后运行,发现已经实现了修改字体的下划线、斜体、粗体属性的功能,说明信号与槽函数已经关联了。

QWDialog 的构造函数执行ui->setupUi(this); ------->的 ui_qwdialog.h 中setupUi有:

 QMetaObject::connectSlotsByName(QWDialog);

connectSlotsByName<QWDialog>函数将搜索QWDialog界面上的所有组件,将信号与槽函数的信号和槽关联起来。它假设槽函数的名称是:void on_<object name>_<signal name>(<signal parameters>)

比如,通过UI设计器的操作,为chkBoxUnder自动生成的槽函数是:void QWDialog::on_chkBoxUnder_clicked(bool checked)。那么,connectSlotsByName()就会将此信号和槽函数关联起来,如同执行了下面的这样一条语句:
connect(chkBoxUnder, SIGNAL(clicked (bool)),  this, SLOT (on_chkBoxUnder_clicked (bool)); 

这就是用 UI 设计器可视化设计某个组件的信号响应槽函数,而不用手工去将其关联起来的原因,都是在界面类的构造函数里调用 setupUi()自动完成了关联。

总结:

1、选中组件--->go to slot---->clicked(bool)----->添加代码

2、checkBox可以同时选中

4.2、字体颜色设置

设置字体的 3 个 RadioButton 是互斥性选择的,即一次只有一个 RadioButton 被选中,虽然也可以采用可视化设计的方式设计其 clicked()信号的槽函数,但是这样就需要生成 3 个槽函数。这里可以简化设计,即设计一个槽函数,将 3 个 RadioButton 的 clicked()信号关联到这一个槽函数。为此,在 QWDialog 类的 private slots 部分增加一个槽函数定义如下:

void setTextFontColor();

提示 将鼠标光标移动到这个函数的函数名上面,单击右键,在弹出的快捷菜单中选择“Refactor”→“Add Definition in qwdialog.cpp”,就可以在 qwdialog.cpp 文件中自动为函数 setTextFontColor()生成一个函数框架。

void QWDialog::setTextFontColor()
{
    QPalette Plet = ui->txtEdit->palette();
    if(ui->rBtnBlack->isChecked())
        Plet.setColor(QPalette::Text, Qt::black);
    else if(ui->rBtnBlue->isChecked())
        Plet.setColor(QPalette::Text, Qt::blue);
    else if(ui->rBtnRed->isChecked())
        Plet.setColor(QPalette::Text, Qt::red);
    ui->txtEdit->setPalette(Plet);
}

由于这个槽函数是自定义的,所以不会自动与 RadioButton 的 clicked()事件关联,此时编译后运行程序不会实现改变字体颜色的功能。需要在 QWDialog 的构造函数中手工进行关联,代码如下


QWDialog::QWDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QWDialog)
{
    ui->setupUi(this);
    connect(ui->rBtnBlack, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
    connect(ui->rBtnBlue, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
    connect(ui->rBtnRed, SIGNAL(clicked()), this, SLOT(setTextFontColor()));
}

总结:1、QWDialog 类的 private slots声明槽函数:void setTextFontColor();点击函数名Refactor生成在qwdialog.cpp生成函数框架,并补全函数。

2、在qwdialog.cpp的构造函数里面手动关联

3、RadioButton为单选框

4.3、按钮功能设置

“确定”表示确认选择并关闭对话框,“取消”表示取消选择并关闭对话框,“退出”则直接关闭对话框。

QWDialog是从QDialog继承而来的,QDialog提供了accept(),erject(),close()等槽函数来表示这三种状态,只需要将按钮的clicked()信号与相应槽函数关联即可。

在 UI 设计器里,单击上方工具栏里的“Edit Signals/Slots”按钮[快捷键为F4,取消为F3],窗体进入信号与槽函数编辑状态。

将鼠标移动到“确定”按钮上方,再按下鼠标左键,移动到窗体的空白区域释放左键,这时出现[确定&窗口]关联对话框

  • 左侧的列表框里显示了 btnOK 的信号,选择 clicked(),右边的列表框里显示了QWDialog 的槽函数,选择 accept(),单击“OK”按钮
  • btnCancel 的 clicked()信号与 QWDialog 的 reject()槽函数关联
  •  btnClose的 clicked()信号与 QWDialog 的 close()槽函数关联。
  • 右侧列表框中没有 close()槽函数,需要勾选下方的“Show signals and slots inherited from QWidget”才会出现 close()函数。

设置完 3 个按钮的信号与槽关联之后,在窗体下方的 Signals 和 Slots 编辑器里也显示了这 3个关联。实际上,可以直接在 Signals 和 Slots 编辑器进行关联设置。现在编译并运行程序,单击这 3 个按钮都会关闭程序。

现在编译并运行程序,单击这 3 个按钮都会关闭程序。

那么,这 3 个按钮的信号与槽函数的关联是在哪里实现的呢?答案在 setupUi()函数里,在setupUi()函数里自动增加了以下 3 行代码:

QObject::connect(btnOK, SIGNAL(clicked()), QWDialog, SLOT(accept()));
QObject::connect(btnCancel, SIGNAL(clicked()), QWDialog, SLOT(reject()));
QObject::connect(btnClose, SIGNAL(clicked()), QWDialog, SLOT(close()));

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt:可视化UI设计 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 虚拟主机的配置

    三种虚拟主机的配置 开启apache服务 编写环境变量 root localhost vim etc profile d httpd sh export PATH usr local apache bin PATH root localho
  • kettle表数据比较

    使用合并记录组件 我的kettle死活不能保存中文 唉 其中tab in 1和tab in 2代表两个数据源 合并记录 新旧数据源可随意指定 获取需要对比的字段 此处为了对比将比较记录先放在file中 identical 比较的所有字段相同
  • PPTP - GRE

    PPTP GRE PPTP Point to Point Tunneling Protocol 点对点隧道协议 GRE Generic Routing Encapsulation 通用路由封装 PPTP 的连接过程如下图 PPTP 可以用于
  • Python和Java读写文件的对比

    博主平时用Python比较多 最近因为工作需要使用Java编程 比较之下 发现Python读写文件真是太方便了 Java读写文件非常繁琐 简直让人抓狂 Python读写文件的语句 读文件 with open readFile r as in
  • 小程序实现毛玻璃的效果

    利用css的filter这个属性实现 在有弹框弹出的时候背景出现高斯模糊的效果 写个小例子记录一下 这个是背景是地图的情况下 做的处理 不管是文字还是图片什么的 在弹出框出来的时候给背景添加filter blur 20rpx 中间值的模糊程
  • Linux虚拟机sqlite数据库安装教程、命令实现sqlite

    参考 Linux虚拟机sqlite数据库安装教程 作者 图触靓 发布时间 2021 04 08 19 07 56 网址 https blog csdn net bhbhhyg article details 115528254 一 在官网下
  • Spark性能调优之广播变量

    一 背景 举例来说 虽然是举例 但是基本都是用我们实际在企业中用的生产环境中的配置和经验来说明的 50个executor 1000个task 一个map 10M 默认情况下 1000个task 1000份副本 10G的数据 网络传输 在集群
  • 帆软报表FineReport中数据连接之Tomcat配置JNDI连接

    1 问题描述 在帆软报表FineReport中 通过JNDI方式定义数据连接 首先在Tomcat服务器配置好JNDI 然后在设计器中直接调用JNDI的名字 即可成功使用JNDI连接 连接步骤如下 2 实现步骤 使用版本及环境 下面以Wind
  • 【ES6】Generator函数

    文章目录 一 声明Generator函数 二 调用 三 next 四 yield 五 return与yield区别 一 声明Generator函数 Generator函数 又称生成器函数 是ES6的一个重要的新特性 普通函数用functio
  • 魏副业而战:闲鱼推广显示设备异常怎么办

    我是魏哥 与其在家躺平 不如魏副业而战 今天是三八节 祝各位小姐姐们节日快乐 做网络项目 不免会遇到各种各样的问题 有人勇往直前 找方法 有人选择退缩 不同的选择 不同的结果 那么 遇到问题 我们应该怎么做呢 魏哥建议问度娘 一般情况下 我
  • VMWare Workstation 16 安装 Ubuntu 22.04 LTS

    最近想编译Android8 1 系统源码 不太想安装双系统 先尝试用虚拟机安装Ubuntu来编译试试 过程中也遇到一些特殊的错误 因此做了一次记录 VMWare Workstation 16 的下载和安装这里不作介绍 网上也有很多注册码可用
  • (Animator详解一)mixamo动画导入Unity的一些配置

    Mixamo是Adobe公司出品的免费动画库 可商用 软件分为characters 角色 Animations 动画 两个部分 下方的搜索框可以搜寻你想要的动作动画 网址为 Mixamo 搜索框的子菜单表示动画的类别 当我们的项目需要角色动
  • 【Xilinx Vivado时序分析/约束系列2】FPGA开发时序分析/约束-建立时间

    目录 基本概念 数据结束时间 Data finish time 保持时间门限 保持时间余量 Hold Slack 基本概念 数据结束时间 Data finish time 之前解释了数据达到的时间 对于data arrival time T
  • cpu矿工cpuminer-multi编译与使用

    文章目录 编译步骤 cpuminer multi 矿工运行 cpuminer multi有很多不同前辈开发 这里选用star最多且最流行的 lucasjones cpuminer multi 在编译中遇到了很多坑 这里全部整合到流程中 如果
  • nimg 文件服务器,NIMG-45. DEEP LEARNING-BASED PERITUMORAL MICROSTRUCTURE MAPPING IN GLIOBLASTOMAS USING FR...

    摘要 PURPOSE Characterization of the peritumoral microenvironment is a widely researched but as yet unsolved problem Deter
  • K-近邻算法预测电影类型

    K 近邻算法预测电影类型 k 近邻算法是一种比较简单 但是在一些方面又有很多作用的算法 比较常用的就是推荐入住位置 或者推荐入住酒店等等 K 近邻算法的原理 就是根据特征值 计算出离自己最近的那个分类 自己也属于那个类别 K 近邻是一种分类
  • 吴恩达机器学习(三) 无监督学习

    Unsupervised Learning Unsupervised learning allows us to approach problems with little or no idea what our results shoul
  • Django框架

    目录 目录 一 虚拟环境 1 什么是虚拟环境 2 作用 3 wondows下安装使用 二 Django框架 1 安装Django 2 拓展 虚拟机和虚拟环境问题 2 1虚拟机的三种网络模式 3 创建Django项目 3 1完整创建Djang
  • Python中Print()函数的用法___实例详解(全,例多)

    Python中Print 函数的用法 实例详解 全 例多 目 录 一 print 函数的语法 二 print 打印输出文本 三 print 中空格的使用方法 四 Print 换行 五 区隔符 sep 六 制表符 t 七 输出数学表达式 八
  • Qt:可视化UI设计

    1 创建项目 修改组件的对象名字和显示文本内容 创建一个 Widget Application 项目类 QDialog 在创建窗体时选择基类 QDialog 生成的类命名为 QWDialog 并选择生成窗体 在界面设计时 对需要访问的组件修