Qt:可视化UI设计

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()));

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17835.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt设计开发】GUI界面设计开发

文章目录 一、Qt简介和下载安装二、Qt入门2.1 创建第一个项目2.2 快捷键和命名规范2.3 Qt项目和VS2022项目相互转换 三、Qt基础3.1 Qt对象树和窗口坐标系概念3.2 QPushButton3.3 信号和槽(signals and slots)3.3.1 pushbutton关闭窗口3.3.2 自定义信号和槽 3.4 Lambda表达式3.5…

【饭谈】ChatGpt如果让软件ui都消失的话,那ui自动化测试该何去何从?

“未来的软件长什么样&#xff1f;” 一位妹子产品经理问我&#xff1a;“你说说未来的软件ui是什么样的&#xff1f;听到这个问题我先是诧异了一下&#xff0c;随即陷入了沉思。” 我看着眼前的产品经理&#xff0c;她是一位比较年轻干练的女强人类型&#xff0c;1.65的身材…

chatgpt赋能python:Python如何设计UI:最佳实践和关键洞察

Python如何设计UI&#xff1a;最佳实践和关键洞察 作为一种支持多种编程范式和用途的高级语言&#xff0c;Python已经成为了许多技术创造者和创业者的首选工具之一。但是&#xff0c;Python最初并不是为了动态用户界面&#xff08;Dynamic User Interface&#xff0c;简称UI&a…

基于Qt的ui图形化界面进行的界面设计

qt初学者往往会发现这样的一个问题——无论是我买的相关的书&#xff0c;还是网上博客的内容&#xff0c;基本全都是利用纯代码的形式来进行界面设计的。而初学者对各种控件的代码实现并不熟悉&#xff0c;往往在这里耗费大量时间。故本篇文章介绍了通过ui图形化界面进行设计的…

职场神器:只需三分钟,AI工具让我变成插画师

绘画技能 一般来说&#xff0c;搞技术的&#xff0c;写文章的&#xff0c;在绘画的这棵技能树上的加点往往都是零。 而且绘画和音乐这些技能往往是需要一定天赋的&#xff0c;它不像写代码和开挖机&#xff0c;后两者往往经过培训以后人人都能学会&#xff0c;而前两者没有一…

设计师与 ChatGPT 应该如何共处?

ChatGPT 的火爆&#xff0c;导致众多设计师开始忧心忡忡&#xff01; ChatGPT那么厉害&#xff0c;是不是设计师要被取代了&#xff1f;&#xff1f;? ChatGPT以及很多 AI 生成插画和图片的工具和软件&#xff0c;不仅为我们带来了惊喜&#xff0c;也让我们感受到了不少担忧!…

美国人真的开始害怕AI了

ChatGPT 发布半年后&#xff0c;人类终于意识到&#xff0c;世界已经彻底改变了。 这变化&#xff0c;比以往任何时候都更迅猛&#xff0c;更让人措手不及。 劳动者&#xff0c;学者&#xff0c;技术专家&#xff0c;NGO&#xff0c;政府&#xff0c;人们不得不作出应对。 这是…

三星引入ChatGPT半个月泄密3次;MidJourney V5相机镜头完整参数列表;万字长文,拆解投身大模型3个本质问题 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『三星引入 ChatGPT 半个月泄密三次』数据安全是个大问题啊&#xff01; 据韩国媒体报道&#xff0c;三星电子 (Samsung Electronics)…

2021高考成绩查询理综各科得分,2021河南高考总分及各科分数 满分分数是多少

河南高考试卷总分为750分&#xff0c;其中语文科目满分150分&#xff1b;数学科目满分150分&#xff1b;英语科目满分150分&#xff1b;文综和理综各自均为300分。 2021河南高考各科及满分分数设置考试科目顺序满分分数高考总分 语文150分750分 文数/理数150分 文综/理综300分 …

ChatGPT写的2023全国高考作文,什么水平?

2023年全国统一高考&#xff0c;1291万考生赶赴考场&#xff0c;高考语文科目考试结束后&#xff0c;备受关注的各地高考作文题目也已经新鲜出炉&#xff01; 随后&#xff0c;网上也掀起了用Chat-GPT写高考作文的热风&#xff0c;小编用全国甲卷做了尝试&#xff0c;以下是自…

恩平高考成绩查询2021,高考成绩放榜,恩平文理科这两名高分考生厉害了!

(来源&#xff1a;江门日报恩平记者站) 原标题&#xff1a;高考成绩放榜&#xff0c;恩平文理科这两名高分考生厉害了&#xff01; 2020广东高考放榜 今天下午 广东省高考成绩正式公布 文科本科线&#xff1a;430分理科本科线&#xff1a;410分 下面一起来看看 今年高考恩平文科…

数据分析2020年全国各省分高考成绩分布情况

开始 突发奇想&#xff0c; 想看下高考成绩的分布&#xff0c; 如果把每个省市的成绩划线成0-100 分会怎么样&#xff0c;简单的来说&#xff0c; 认为最高分的考了100分&#xff0c;最低分考了0分&#xff0c; 计算一下各个分数段的人数就好了&#xff0c; 顺便可以用这个数…

李开复:谈谈那些你不知道的人工智能!

https://www.toutiao.com/a6678214501399003655/ 创新工场董事长兼ceo李开复在清华大学做了名为《人工智能的黄金时代》的演讲。 在演讲中&#xff0c;李开复博士用简易的语言较为系统的介绍了人工智能&#xff0c;深度学习等概念&#xff0c;并且阐明了目前人工智能物质的问题…

李开复——人工智能领域的中坚力量

据英国《自然》杂志18日发表的论文报道&#xff0c;一款新版的“阿法狗”&#xff08;AlphaGo&#xff09;横空出世。这款名叫“阿法狗—零”&#xff08;AlphaGo Zero&#xff09;的新程序&#xff0c;以100比0的战绩打败了旧版“阿法狗”。再次引发了公众对于人工智能的热议。…

李开复:旗下AI公司或在2021年上市,估值至少10亿美元

人工智能技术的公司已经到了开花结果的时刻&#xff0c;用技术价值转换为商业价值的公司&#xff0c;一定是未来。 根据商业媒体网站 Bloomberg 报道&#xff0c;创新工场&#xff08;Sinovation Ventures&#xff09;董事长兼首席执行官李开复近日公开表示&#xff0c;他旗下…

李开复:李飞飞是人工智能的“良心”

李开复&#xff1a;李飞飞是人工智能的“良心” https://mp.weixin.qq.com/s/7mpIV902QYgcIkX3LM42Ww 【网易智能讯 10月22日消息】近日&#xff0c;李飞飞回归斯坦福大学之后&#xff0c;正式宣布启动以人为本人工智能项目&#xff0c;创建了以人为本人工智能研究院(Stanford …

“AI超人”李开复慢下来的投资节奏

https://www.toutiao.com/a6652888471444652547/ 2019-02-01 12:45:04 来源&#xff1a;投中网 作者&#xff1a;Michele “在AI崛起的时代里&#xff0c;如果只是守株待兔&#xff0c;等着那些超级模式撞到商业天才&#xff0c;碰撞出点子&#xff0c;正好敲到我们的门&…

李开复,活在AI与人群里

2019-11-19 13:50:14 最大化战争 李开复的西装裤口袋是一个精确测试后确定的尺寸&#xff0c;它和最新款iPhone的尺寸贴合&#xff0c;既不会浅到放不进去&#xff0c;又不会深到不容易取出来。在重要场合&#xff0c;他会戴宽度7厘米的细领带&#xff0c;比市面上大部分领带…

【人工智能 AI 2.0】李开复:我亲自筹组 Project AI 2.0 不仅仅要做中文版ChatGPT

Project AI 2.0: 在全球范围寻找具有 AI 大模型、NLP、Multi-modality 等领域能力的优秀技术人和研究员,一起加入对 AI 2.0 未来有着丰沛激情和愿景的团队。 目录

招募全球英才!李开复宣布筹组中文版 ChatGPT 公司“Project AI 2.0”

今日&#xff0c;创新工场董事长兼 CEO 李开复在朋友圈宣布&#xff0c;正在亲自筹组 Project AI 2.0&#xff0c;这是创新工场塔尖孵化的第 7 家公司&#xff0c;致力打造 AI 2.0 全新平台和 AI-first 生产力应用的全球化公司。 这是前几天&#xff0c;李开复继宣告“AI 2.0 已…