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

qt初学者往往会发现这样的一个问题——无论是我买的相关的书,还是网上博客的内容,基本全都是利用纯代码的形式来进行界面设计的。而初学者对各种控件的代码实现并不熟悉,往往在这里耗费大量时间。故本篇文章介绍了通过ui图形化界面进行设计的过程并简单梳理了一下工程的结构。
下面以ubuntu系统下的一个双窗口互相切换的简易计算器为例。效果图如下:

  • 第一个界面的第一个标签
    功能是在输入框中输入两个数,下面的显示框显示相加的结果。
    第一个界面的第一个标签

  • 第一个界面的第二个标签
    功能是在输入框中输入两个数,下面的显示框显示相乘的结果。按切换按钮可切换到第二个界面。
    第一个界面的第二个标签

  • 第二个界面
    功能是把第一个界面的两个运算结果的和显示在显示框中。按“返回”按钮可回到第一个界面。
    第二个界面

下面说下具体实现步骤吧。
一.创建工程
由于我们要实现两个窗口之间的互相切换,故我们要创建两个类。首先建立工程以及第一个类:
打开Qt creater, File->New file or project,project选择applications,右边目录选择Qt GUI Application,下一步后为工程命名,这里我们就命名calculator,下一步选择编译及调试工具,再下一步选择窗口类型,这里就选择QMainWindow吧,类的命名为calculator,注意勾选Generate Form,这样工程中才会有ui界面,最后一步不管,直接finish。至此,我们已经完成了工程及第一个类的创建。

下面创建第二个类。之前说过,相关书籍和博客上普遍都是采用代码的形式来创建第二个类的,相当的麻烦。这里我们利用图形化界面直接创建第二个类:右键工程名calculator,选择Add New,在弹出的对话框中,Files and Classes选择Qt,右边选择Qt Designer Form Class,下一步的模板就选择MainWindow吧。下一步命名extendedwindow,最后一步finish。至此我们就创建了工程中的第二个类。接着,在main.cpp包含头文件“extendedwindow.h”并定义新的对象e——extendedwindow e;是不是比用代码创建方便很多啊。
这里写图片描述
完成以上步骤后,你的projects栏中应该有如下的树形图界面——
这里写图片描述

二.接下来我们利用ui界面完成界面的设计,具体功能的实现将放在步骤3中讲解。
先编辑第一个窗口即calculator这个窗口,双击calculator.ui进入图形化设计界面,从左边的控件栏中找到containers下的tab widget,把他拖出来放到界面中,再拖出两个Line Edit和一个Text Browser以及一个Lable到tab widget的第一个tab中,右上角有一个树形图栏记录着当前窗口中的对象和类,在这里修改创建的对象的名字,提高可读性(如图)这里写图片描述
接着利用界面上方的对齐工具进行对齐(如图)这里写图片描述
第二个标签里的内容也同样操作。每个控件的大小可以通过拖动改变。最后再拖动一个push button到tab widget控件外部。最终的效果图如之前展示的界面一所示。

完成了第一个窗口的设计,接下来完成第二个窗口的设计。需要用到的控件是text browser和push button,过程这里就不说了。

三.功能的实现
Qt各对象之间的通信是通过信号与槽来实现的。故不要想着用对象a去访问对象b的私有成员。带参数的信号完全可以实现数据的传递。信号与槽机制的特点就是可以使得对象在彼此完全不了解的情况下将他们的行为联系起来。对于这句话的理解是:各个类在定义时完全不需要考虑他与其他类可能会有什么联系,各自定义各自的即可。当需要把几个对象联系起来的时候,临时写一句connect就可以达成目的。
由于本文的重点在于介绍通过ui图形化界面实现界面的设计,对于计算器计算的相关内容就不进行叙述了,相关代码将在最后贴出。这个部分我们只讲下对象是怎么通过信号与槽来进行通信的:

3.1控件对象与窗口对象之间的通信
选中tab1中的上方的那个line edit,右键,选择go to slot,接着会弹出一个对话框,里面是各种类型的line edit所属的QLineEdit类中的信号成员。通过这些信号的名字就可以猜到它的功能,如editingFinished(),它表示如果用户对这个行输入框的操作结束了(包括失去焦点和回车这两种形式),则行输入框这个对象将发射这个信号。

这里我们选择textEdited(),则界面自动跳到calculator.cpp文件,并且这个文件中已经自动创建了一个槽函数

void calculator::on_number1_textEdited(const QString &arg1)

经过观察,我们发现这是一个属于calculator类的槽函数。事实上,如果你现在打开calculator.h文件,你会发现Qt creater已经自动帮你在类的定义中加上了刚刚那个槽函数。除此之外,软件还自动帮你完成了这两个对象信号与槽的连接并将这段代码隐藏了起来(具体在哪不知道)。当你编辑行输入框时,信号被发送给calculator定义的对象的槽,槽函数执行特定的功能。需要强调的是,函数

QObject::connect ( const QObject * sender, const char* signal, const QObject * receiver, const char* member ) 

的第一个参数和第三个参数是对象的地址而不是类的地址。而窗口对应的对象的定义是在main.cpp中进行的

calculator w;

参数写法应是&number1(number1是我对那个行输入框的命名,可在右上角的树形图栏中查看)和&w。这里要通过第一个输入框读取得到的数(字符型),在槽函数中写如下代码:

QString n1=ui->number1->text();
num1=n1.toDouble();

需要解释的是:
①:
这里的ui代表的就是caltulator.ui这整个图形化界面。它的定义在头文件calculator.h里面,它是类calculator的一个成员

private:Ui::calculator *ui;

可见,ui是指向类calculator对象的一个指针。利用它可以对ui图形化界面里的控件方便地进行访问。具体方法为ui->…。(ui后输入小数点“.”,软件会自动改成->)。细心的人可能会发现,calculator.h和extendedwindow.h中都有ui,而各cpp文件中也都有ui,他们指向不同的对象,编译器却没报错。具体原因我也不知道,总之利用他们可以访问各自的图形化界面。

②:
通过输入框得到的内容是字符型的,故还需要用所示代码将其转换成double型数据。函数定义可在Qt Assistant中查找。

3.2 两个窗口对象之间的通信
两个窗口之间的通信需要我们手动去写所有的代码。思路如下:在类calculator和extendedWindow中各定义一个信号和槽函数(带不带参数视情况而定),用于他们之间的通信。在主函数中将两组信号与槽联系起来。通过软件自动建立的连接,让窗口一中按钮对象与类calculator对象w通信,槽函数收到信号后,隐藏第一个窗口,再让其主动发送信号给类extendedwindow对象e,让第二个窗口显示出来。

//两组信号与槽的联系
QObject::connect(&w,SIGNAL(w2e(double,double)),&e,SLOT(receive(double,double)));
QObject::connect(&e,SIGNAL(e2w()),&w,SLOT(receive()));
//窗口一控件对象的槽函数
void calculator::on_switch_2_clicked()
{this->hide();emit w2e(Result1,Result2);
}
//类extendedwindow槽函数
void extendedWindow::receive(double n1,double n2)
{this->show();QString n=QString::number((n1+n2),'g',6);ui->textBrowser->setText(n);
}
//窗口二控件对象的槽函数
void extendedWindow::on_pushButton_clicked()
{this->hide();emit e2w();
}
//类calculator对象的槽函数
void calculator::receive()
{this->show();
}

至此,功能的实现部分全部讲完
下面贴出各文件的代码,ui界面需自己设计:

//calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H#include <QMainWindow>
#include <QString>namespace Ui {
class calculator;
}class calculator : public QMainWindow
{Q_OBJECTpublic:explicit calculator(QWidget *parent = 0);~calculator();private slots:void on_number1_textEdited(const QString &arg1);void on_number2_textEdited(const QString &arg1);void on_number2_editingFinished();void on_number1_2_textEdited(const QString &arg1);void on_number2_2_textEdited(const QString &arg1);void on_number2_2_editingFinished();void on_switch_2_clicked();void receive();signals:void w2e(double,double);private:Ui::calculator *ui;QString input;double num1,num2,num3,num4,Result1,Result2;
};#endif // CALCULATOR_H//extendedwindow.h
#ifndef EXTENDEDWINDOW_H
#define EXTENDEDWINDOW_H#include <QMainWindow>namespace Ui {
class extendedWindow;
}class extendedWindow : public QMainWindow
{Q_OBJECTpublic:explicit extendedWindow(QWidget *parent = 0);~extendedWindow();public slots:void on_pushButton_clicked();void receive(double,double);signals:void e2w();
private:Ui::extendedWindow *ui;
};#endif // EXTENDEDWINDOW_H//calculator.cpp
#include "calculator.h"
#include "ui_calculator.h"calculator::calculator(QWidget *parent) :QMainWindow(parent),ui(new Ui::calculator)
{ui->setupUi(this);
}calculator::~calculator()
{delete ui;
}void calculator::on_number1_textEdited(const QString &arg1)
{QString n1=ui->number1->text();num1=n1.toDouble();}void calculator::on_number2_textEdited(const QString &arg1)
{QString n2=ui->number2->text();num2=n2.toDouble();
}void calculator::on_number2_editingFinished()
{Result1=num1+num2;QString n3=QString::number(Result1,'g',6);ui->result->setText(n3);
}void calculator::on_number1_2_textEdited(const QString &arg1)
{QString n=ui->number1_2->text();num3=n.toDouble();
}void calculator::on_number2_2_textEdited(const QString &arg1)
{QString n=ui->number2_2->text();num4=n.toDouble();
}void calculator::on_number2_2_editingFinished()
{Result2=num3*num4;QString n=QString::number(Result2,'g',6);ui->result_2->setText(n);
}void calculator::on_switch_2_clicked()
{this->hide();emit w2e(Result1,Result2);
}void calculator::receive()
{this->show();
}//extendedwindow.cpp
#include "extendedwindow.h"
#include "ui_extendedwindow.h"extendedWindow::extendedWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::extendedWindow)
{ui->setupUi(this);
}extendedWindow::~extendedWindow()
{delete ui;
}void extendedWindow::on_pushButton_clicked()
{this->hide();emit e2w();
}void extendedWindow::receive(double n1,double n2)
{this->show();QString n=QString::number((n1+n2),'g',6);ui->textBrowser->setText(n);
}//main.cpp
#include "calculator.h"
#include <QApplication>
#include "extendedwindow.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);calculator w;extendedWindow e;QObject::connect(&w,SIGNAL(w2e(double,double)),&e,SLOT(receive(double,double)));QObject::connect(&e,SIGNAL(e2w()),&w,SLOT(receive()));w.setFixedSize(500,500);e.setFixedSize(500,500);w.move(500,50);e.move(500,50);e.hide();w.show();return a.exec();
}

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

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

相关文章

职场神器:只需三分钟,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 已…

自然语言处理复习笔记

自然语言处理期末复习笔记 复习摘要 大致梳理了下《自然语言处理》这门课程的知识纲要 作者&#xff1a; Hongtauo CSDN链接&#xff1a;(27条消息) Hongtauo的博客_CSDN博客-笔记,实验题,NLP学习之路领域博主 GitHub&#xff1a;https://github.com/Hongtauo/NLP_notebook…

GPT-4逆天联网!微软Bing突然全面开放插件系统,文生图原生支持中文

【导读】微软突然放炸弹&#xff0c;「ChatGPT搜索引擎」必应史诗级更新&#xff0c;最强插件系统超实用全新功能目不暇接&#xff01;现在&#xff0c;无需排队&#xff0c;人人可用。 大的来了&#xff01; 就在刚刚&#xff0c;微软突然开放了搭载GPT-4的全新Bing聊天机器…

Vega AI-无需科学上网的AI绘画

最近AI绘图也因为ChatGPT也快速推上了热门的领域&#xff0c;目前最主流的两个产品&#xff1a;Midjouney 和 Stable Diffusion WebUI&#xff08;SD&#xff09;&#xff0c;然后Midjouney 使用需要魔法&#xff0c;同时每个月高昂的30美刀的价格也让很多人望而却步&#xff1…

【原创】万字长文讲解AI绘画基本技术原理

作者&#xff1a;黑夜路人 时间&#xff1a;2023年4月12日 AIGC是什么 AIGC - AI Generated Content &#xff08;AI生成内容&#xff09;&#xff0c;对应我们的过去的主要是 UGC&#xff08;User Generated Content&#xff09;和 PGC&#xff08;Professional user Generat…