---
title: framework-cpp-qt-04-代码化的界面绘制
EntryName: framework-cpp-qt-04-ui-design-by-code
date: 2020-04-09 15:50:17
categories:
tags:
- qt
- c/c++
---

章节描述:

UI 的可视化设计是对用户而言的,其实底层都是 C++ 的代码实现,只是 Qt 巧妙地进行了处理,让用户省去了很多繁琐的界面设计工作。

由于Qt界面设计的底层其实都是由 C++ 语言实现的,底层实现的功能比可视化设计更加强大和灵活。

创建无UI的项目

某些界面效果是可视化设计无法完成的,或者某些人习惯了用纯代码的方式来设计界面,就可以采用纯代码的方式设计界面,如 Qt 自带的实例基本都是用纯代码方式实现用户界面的。可视化UI设计与代码化UI设计是可以混在一起的。

采用代码设计实现 UI 时,需要对组件的布局有个完整的规划,不如可视化设计直观,且编写代码工作量大。(建议在代码化设计中,考虑事先使用一些产品文档设计工具进行原型设计)

可视化UI设计与代码化UI设计是可以混在一起的。但为了做出明显的对比,我们使用无界面的工程作为起点。

首先建立一个 QT Widgets Appliation 项目 ,填写有关项目信息。

我这里选择的基类是QWidget,类名为Widget

不勾选“Generate form”(创建界面)复选框。

创建后的项目文件目录树下没有 .ui 文件。

我们的目标是为了创建一个3个单选框,3个选择框,1个编辑框的界面。

注意:与可视化设计得到的窗体类定义不同,Widget的类定义里没有指向界面的指针 ui

编写有关代码

头文件

在类的头文件widget.h中,做以下步骤:

添加有关对象

为了灵活,我们使用指针的形式,等到必要时再实例化。

#include <QCheckBox>
#include <QRadioButton> ... QCheckBox *chkBoxBold;
QRadioButton *rBtnBlack;

添加 有关 的 槽

private slots:
void on_chkBoxBold(bool checked); //Bold 的clicked(bool)信号的槽函数
void setTextFontColor(); //设置字体颜色

组件初始化

包括有关UI的创建、以及信号-槽的连接。

void    iniUI();			//UI 创建与初始化
void iniSignalSlots(); //初始化信号与槽的连接

完整的头文件

// widget.h

#ifndef WIDGET_H
#define WIDGET_H #include <QWidget> #include <QCheckBox>
#include <QRadioButton>
#include <QPlainTextEdit>
#include <QPushButton> class Widget : public QWidget
{
Q_OBJECT private:
QCheckBox *chkBoxUnder;
QCheckBox *chkBoxItalic;
QCheckBox *chkBoxBold; QRadioButton *rBtnBlack;
QRadioButton *rBtnRed;
QRadioButton *rBtnBlue; QPlainTextEdit *txtEdit; QPushButton *btnClose; void iniUI();//UI 创建与初始化
void iniSignalSlots();//初始化信号与槽的链接 private slots:
void on_chkBoxUnder(bool checked); // Underline 的clicked(bool)信号的槽函数
void on_chkBoxItalic(bool checked); // Italic 的clicked(bool)信号的槽函数
void on_chkBoxBold(bool checked); // Bold 的clicked(bool)信号的槽函数
void setTextFontColor(); //设置字体颜色 public:
Widget(QWidget *parent = nullptr);
~Widget();
};
#endif // WIDGET_H

源文件

根据头文件的情况,我们在源文件中给出具体的实现。

槽函数的实现

槽函数的功能与界面化设计时类似,只是在访问界面组件时,无需使用 ui 指针,而是直接访问 类里定义的界面组件的成员变量即可。

void Widget::on_chkBoxUnder(bool checked)
{
QFont font=txtEdit->font();
font.setUnderline(checked);
txtEdit->setFont(font);
} ..
font.setBold(checked); ..
font.setItalic(checked);

界面组件的创建与布局

控件在布局时可以先不指定父窗口,最后交由Layout统一指定。

1)创建组件比较简单,只需要new就可以了。

2)为了布局好看,需要添加一些布局(Layout),再将对应的组件加入布局中。

3)将布局加入一个"主"布局。

4)将"主布局"设置为窗体的主布局

void Widget::iniUI()
{
//创建 Underline, Italic, Bold 3 个CheckBox,并水平布局
chkBoxUnder = new QCheckBox(tr("Underline"));
chkBoxItalic = new QCheckBox(tr("Italic"));
chkBoxBold = new QCheckBox(tr("Bold")); QHBoxLayout *HLay1 = new QHBoxLayout; HLay1->addWidget(chkBoxUnder);
HLay1->addWidget(chkBoxItalic);
HLay1->addWidget(chkBoxBold); //创建 Black, Red, Blue 3 个RadioButton,并水平布局
rBtnBlack = new QRadioButton(tr("Black"));
rBtnBlack->setChecked(true);
rBtnRed = new QRadioButton(tr("Red"));
rBtnBlue = new QRadioButton(tr("Blue"));
QHBoxLayout *HLay2 = new QHBoxLayout;
HLay2->addWidget(rBtnBlack);
HLay2->addWidget(rBtnRed);
HLay2->addWidget(rBtnBlue);
//创建 退出PushButton, 并水平布局
btnClose = new QPushButton(tr("Close")); QHBoxLayout *HLay3 = new QHBoxLayout; HLay3->addStretch();
HLay3->addWidget(btnClose);
//创建文本框,并设置初始字体
txtEdit = new QPlainTextEdit;
txtEdit->setPlainText("Hello world\n\nIt is my demo");
QFont font = txtEdit->font(); //获取字体
font.setPointSize(20);//修改字体大小
txtEdit->setFont(font);//设置字体
//创建垂直布局,并设置为主布局
QVBoxLayout *VLay = new QVBoxLayout;
VLay->addLayout(HLay1); //添加字体类型组
VLay->addLayout(HLay2);//添加字体颜色组
VLay->addWidget(txtEdit);//添加PlainTextEdit
VLay->addLayout(HLay3);//添加按键组
setLayout(VLay); //设置为窗体的主布局
}

关联信号槽

void Widget::iniSignalSlots()
{
//三个颜色 QRadioButton 的clicked()信号与setTextFontColor()槽函数关联
connect(rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
//三个字体设置的 QCheckBox 的clicked(bool)信号与相应的槽函数关联
connect(chkBoxUnder,SIGNAL(clicked(bool)),
this,SLOT(on_chkBoxUnder(bool)));
connect(chkBoxItalic,SIGNAL(clicked(bool)),
this,SLOT(on_chkBoxItalic(bool)));
connect(chkBoxBold,SIGNAL(clicked(bool)),
this,SLOT(on_chkBoxBold(bool)));
//按钮的信号与窗体的槽函数关联
connect(btnClose,SIGNAL(clicked()),this,SLOT(close()));
}

组件初始化

我们将组件初始化的调用放在构造函数中。

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
iniUI(); //界面创建与布局
iniSignalSlots(); //信号与槽的关联
setWindowTitle("Form created mannually");
}

完整的源文件

// widget.cpp

#include <QHBoxLayout>
#include <QVBoxLayout>
#include "widget.h" Widget::Widget(QWidget *parent)
: QWidget(parent)
{
iniUI(); //界面创建与布局
iniSignalSlots(); //信号与槽的关联
setWindowTitle("Form created mannually");
} Widget::~Widget()
{
} void Widget::on_chkBoxUnder(bool checked)
{
QFont font=txtEdit->font();
font.setUnderline(checked);
txtEdit->setFont(font);
} void Widget::on_chkBoxItalic(bool checked)
{
QFont font=txtEdit->font();
font.setItalic(checked);
txtEdit->setFont(font);
} void Widget::on_chkBoxBold(bool checked)
{
QFont font=txtEdit->font();
font.setBold(checked);
txtEdit->setFont(font);
} void Widget::setTextFontColor() //设置字体颜色
{
QPalette plet=txtEdit->palette();
if (rBtnBlue->isChecked())
plet.setColor(QPalette::Text,Qt::blue);
else if (rBtnRed->isChecked())
plet.setColor(QPalette::Text,Qt::red);
else if (rBtnBlack->isChecked())
plet.setColor(QPalette::Text,Qt::black);
else
plet.setColor(QPalette::Text,Qt::black);
txtEdit->setPalette(plet);
} void Widget::iniUI()
{
//创建 Underline, Italic, Bold 3 个CheckBox,并水平布局
chkBoxUnder = new QCheckBox(tr("Underline"));
chkBoxItalic = new QCheckBox(tr("Italic"));
chkBoxBold = new QCheckBox(tr("Bold")); QHBoxLayout *HLay1 = new QHBoxLayout; HLay1->addWidget(chkBoxUnder);
HLay1->addWidget(chkBoxItalic);
HLay1->addWidget(chkBoxBold); //创建 Black, Red, Blue 3 个RadioButton,并水平布局
rBtnBlack = new QRadioButton(tr("Black"));
rBtnBlack->setChecked(true);
rBtnRed = new QRadioButton(tr("Red"));
rBtnBlue = new QRadioButton(tr("Blue"));
QHBoxLayout *HLay2 = new QHBoxLayout; HLay2->addWidget(rBtnBlack);
HLay2->addWidget(rBtnRed);
HLay2->addWidget(rBtnBlue); //创建 退出PushButton, 并水平布局
btnClose = new QPushButton(tr("Close")); QHBoxLayout *HLay3 = new QHBoxLayout; HLay3->addStretch();
HLay3->addWidget(btnClose);
//创建文本框,并设置初始字体
txtEdit = new QPlainTextEdit;
txtEdit->setPlainText("Hello world");
QFont font = txtEdit->font(); //获取字体
font.setPointSize(20);//修改字体大小
txtEdit->setFont(font);//设置字体
//创建垂直布局,并设置为主布局
QVBoxLayout *VLay = new QVBoxLayout; VLay->addLayout(HLay1); //添加字体类型组
VLay->addLayout(HLay2);//添加字体颜色组
VLay->addWidget(txtEdit);//添加PlainTextEdit
VLay->addLayout(HLay3);//添加按键组 setLayout(VLay); //设置为窗体的主布局
} void Widget::iniSignalSlots()
{
//三个颜色 QRadioButton 的clicked()信号与setTextFontColor()槽函数关联
connect(rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
//三个字体设置的 QCheckBox 的clicked(bool)信号与相应的槽函数关联
connect(chkBoxUnder,SIGNAL(clicked(bool)),
this,SLOT(on_chkBoxUnder(bool)));
connect(chkBoxItalic,SIGNAL(clicked(bool)),
this,SLOT(on_chkBoxItalic(bool)));
connect(chkBoxBold,SIGNAL(clicked(bool)),
this,SLOT(on_chkBoxBold(bool)));
//按钮的信号与窗体的槽函数关联
connect(btnClose,SIGNAL(clicked()),this,SLOT(close()));
}

QT学习:04 代码化的界面绘制的更多相关文章

  1. QT界面绘制学习记录

    1. MVC结构中,model必须作为类的成员变量存在,不可再函数内部申明.否则,会出现函数调用结束,model找不到的错误. 2.QcomboBox可设置为左边空白,右侧一小箭头的形式.代码:com ...

  2. 第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析

    老猿Python博文目录 老猿Python博客地址 按照老猿规划的章节安排,信号和槽之后应该介绍事件,但事件在前面的随笔<PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法 ...

  3. Qt 学习之路 2(29):绘制设备

    Qt 学习之路 2(29):绘制设备 豆子 2012年12月3日 Qt 学习之路 2 28条评论 绘图设备是继承QPainterDevice的类.QPaintDevice就是能够进行绘制的类,也就是说 ...

  4. Qt 学习之路 2(24):Qt 绘制系统简介

    Qt 学习之路 2(24):Qt 绘制系统简介 豆子 2012年10月30日 Qt 学习之路 2 77条评论 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于Q ...

  5. qt学习 (五) 登陆界面之连接按钮

    登陆步骤是比对输入的账号密码与数据库中的表项目是否一致 一样,  跳出mainwidget对话框 不一样,跳出消息错误框 今天就是要进去, 因为进去以后是widget的窗口,所以把用来核对消息的数据库 ...

  6. QT学习(五)----360界面制作(2终结)

    继续上一章的360新特性界面.源代码:http://download.csdn.net/detail/zhangyang1990828/5241242 上一章中实现了整个界面的纯UI设计,这次我们让它 ...

  7. PyQt(Python+Qt)学习随笔:Qt Designer组件属性编辑界面中对话窗QDialog的modal属性

    modal属性表示窗口执行show()操作时是以模态窗口还是非模态窗口形式展示,缺省为False,设置该值与QWidget.windowModality的值设置为 Qt.ApplicationModa ...

  8. Qt 学习之路 2(46):视图和委托

    Home / Qt 学习之路 2 / Qt 学习之路 2(46):视图和委托 Qt 学习之路 2(46):视图和委托  豆子  2013年3月11日  Qt 学习之路 2  63条评论 前面我们介绍了 ...

  9. Qt 学习之路 2(41):model/view 架构

    Qt 学习之路 2(41):model/view 架构 豆子 2013年1月23日 Qt 学习之路 2 50条评论 有时,我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应 ...

  10. Qt 学习之路 2(31):贪吃蛇游戏(1)

    Qt 学习之路 2(31):贪吃蛇游戏(1) 豆子 2012年12月18日 Qt 学习之路 2 41条评论 经过前面一段时间的学习,我们已经了解到有关 Qt 相当多的知识.现在,我们将把前面所讲过的知 ...

随机推荐

  1. STLINK/V2下载器接线方法

    一.ST-LINK ST-LINK产品如下图所示: ST-LINK接口定义如下图所示 ST-LINK与stm32接线 使用SW接法只需要四根线: STM32 ST-LINK VCC(3.3V) TVC ...

  2. Node.js 万字教程

    0. 基础概念 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使用了一个事件驱动.非阻塞式 I/O 模型,让 JavaScript 运行在服务端的开发平台. ...

  3. 2021年5.21NCU第四届校赛

    比赛地址:http://222.204.50.106/contest/39 A 树上祖先 链接:http://222.204.50.106/contest/39/problem/A B 莎士比亚 链接 ...

  4. 一篇文章让你掌握99%的Python运算符。干货很多,建议收藏!!!

    Python 中的运算符是编程中的基础概念,用于执行各种操作和数据计算.以下是一些 Python 中的主要运算符的概述: 运算符 1. 算术运算符 算术运算符语法规则 +:加法 -:减法 *:乘法 / ...

  5. SQL如何删除所有字段都相同的重复数据?

    SQL Server数据库:有时候在处理数据时会遇到不加主键的表,导致数据表内出现了一模一样的数据,刚开始第一时间想到的方式是,把两条数据全部删除,然后再插入一条,但是这种可能数据量比较少的话,还可以 ...

  6. Visual Studio中的四款代码格式化工具

    前言 今天大姚给大家分享四款Visual Studio中的代码格式化工具.扩展插件.大家可以在Visual Studio中的管理扩展或者插件市场下载安装. 代码格式化工具的作用 自动调整代码的布局和风 ...

  7. IceRPC之传入响应和拦截器

    作者引言 .Net 8.0 下的新RPC 很高兴啊,我们来到了IceRPC之传入响应和拦截器->快乐的RPC, 基础引导,让自已不在迷茫,快乐的畅游世界. 传入响应 Incoming respo ...

  8. hashMap添加key重复时返回值的形式

    hashMap添加key重复 System.out.println(map.put(1, 0)); // null System.out.println(map.put(1, 1)); // 0 Sy ...

  9. FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器

    ​AVS3是中国AVS工作组制定的第三代音视频编解码技术标准,也是全球首个已推出的面向8K及5G产业应用的视频编码标准.AVS工作组于2019年3月9日完成第三代AVS视频标准(AVS3)基准档次的制 ...

  10. C# ScottPlot 绘图控件 源码阅读心得体会

    ScottPlot的介绍可以看这篇博客:https://www.cnblogs.com/myshowtime/p/15606399.html 我对代码的理解是这样的: 图像的呈现是靠bitmap,每进 ...