QT自定义优雅的表单控件,简单实现设置界面布局

这篇具有很好参考价值的文章主要介绍了QT自定义优雅的表单控件,简单实现设置界面布局。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QT自定义优雅的表单控件,简单实现设置界面布局

一、实现效果

QT自定义优雅的表单控件,简单实现设置界面布局

表单工具类FormView

FormView.h

#pragma once
#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QStyleOption>
#include <QPainter>
#include <QApplication>
#include <QScreen>
#include <QCheckBox>
#include "QString"
#include "QMap"
#include <functional>
class FormView : public QWidget
{
	Q_OBJECT
public:
	//指定大小的表单,用于纯代码编写UI
	FormView(int width, int height, QWidget* parent = nullptr);
	//不指定大小的表单,用于在designer中使用
	FormView(QWidget* parent = nullptr);
	~FormView();
	//在表单中插入一个控件
	void addWidgetToForm(QWidget* widget);
	//在表单中插入一个可填写项
	void addEditableItem(QString title, QString place_holder);
	//在表单中插入一个可勾选项
	void addCheckableItem(QString title, QString content, bool init_status, std::function<void(bool)> call_back);
	//设置表单控件的可用性
	void setItemEnabled(QString item_title, bool enabled);
	//获取具体控件的句柄
	QLineEdit* getEditableItem(QString title);
	QCheckBox* getCheckableItem(QString title);
	//在表单头部添加一个弹簧(使表单靠下)
	void startForm();
	//在表单尾部添加一个弹簧(使表单靠上)
	void endForm();
	//start end 同时使用,表单居中

	//清空表单所有可填写项
	void Clear();
protected:
	void Init(int width, int height);
	void Init();
	void paintEvent(QPaintEvent* event) override;
private:
	QVBoxLayout* mainLayout;
	QMap<QString, QWidget*> editItems;
	QMap<QString, QWidget*> checkItems;
};

FormView.cpp

#include "FormView.h"
FormView::FormView(int width, int height, QWidget* parent) : QWidget(parent)
{
	Init(width, height);
}

FormView::FormView(QWidget* parent /*= nullptr*/) : QWidget(parent)
{
	Init();
}

FormView::~FormView()
{

}

void FormView::Clear()
{
	for(auto widget : editItems)
	{
		QLineEdit* l = widget->findChild<QLineEdit*>();
		if (l != nullptr)l->clear();
	}
}

void FormView::Init(int width, int height)
{
	setFixedSize(width, height);
	Init();
}

void FormView::Init()
{
	setObjectName(QStringLiteral("form_view"));
	setStyleSheet(QStringLiteral("QWidget#form_view{border:none;background-color:white;border-top-right-radius:8px;border-bottom-right-radius:8px;}"));
	mainLayout = new QVBoxLayout(this);
}

void FormView::paintEvent(QPaintEvent* event)
{
	QStyleOption opt;
	opt.init(this);
	QPainter p(this);
	style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
	QWidget::paintEvent(event);
	
}

void FormView::addWidgetToForm(QWidget* widget)
{
	mainLayout->addSpacing(10);
	mainLayout->addWidget(widget, 0, Qt::AlignLeft);
}

void FormView::addEditableItem(QString title, QString place_holder)
{
	int height = 30;//调整输入框大小
	QWidget* formItem = new QWidget;
	formItem->setFixedSize(width() * 0.8, height+10);
	QHBoxLayout* layout = new QHBoxLayout(formItem);
	QLabel* label = new QLabel(title);
	label->setStyleSheet(QStringLiteral("QLabel{font-size:16px;font-family:Microsoft Yahei;color:#000000;}"
		"QLabel:disabled{font-size:16px;font-family:Microsoft Yahei;color:#828488;}"));
	QLineEdit* edit = new QLineEdit(this);
	edit->setPlaceholderText(place_holder);
	edit->setFixedSize(width() * 0.5, height);
	edit->setStyleSheet(QStringLiteral("QLineEdit{padding-left:22px;padding-right:22px;font-size:15px;font-family:Microsoft Yahei;border-radius:3px;border:1px solid #dcdfe6;color:#606266;}"
		"QLineEdit:hover{border:1px solid #909399;}"
		"QLineEdit:focus{border:1px solid #409EFF;}"));
	edit->setFocusPolicy(Qt::FocusPolicy::ClickFocus);

	layout->addWidget(label, 0, Qt::AlignLeft);
	layout->addStretch();
	layout->addWidget(edit, 0, Qt::AlignRight);

	editItems.insert(title, formItem);
	addWidgetToForm(formItem);
}

void FormView::addCheckableItem(QString title, QString content, bool init_status, std::function<void(bool)> call_back)
{
	int height = 30;
	QWidget* formItem = new QWidget;
	formItem->setFixedSize(width() * 1, height+10);
	QHBoxLayout* layout = new QHBoxLayout(formItem);
	QLabel* label = new QLabel(content);
	label->setStyleSheet(QStringLiteral("QLabel{font-size:16px;font-family:Microsoft Yahei;color:#000000;}"
		"QLabel:disabled{font-size:16px;font-family:Microsoft Yahei;color:#828488;}"));
	QCheckBox* check = new QCheckBox();
	check->setStyleSheet(QStringLiteral("QCheckBox{font-size:16px;font-family:Microsoft Yahei;border:none;}"
		"QCheckBox::indicator{width:20px;height:20px;border-radius:4px;border:1px solid #dcdfe6;}"
		"QCheckBox::indicator:hover{border-radius:4px;border:2px solid #409EFF;}"
		"QCheckBox::indicator:checked{border-radius:4px;border:1px solid #409EFF;background-color:#409EFF;image:url(./icons/checked.png);}"
		"QCheckBox::indicator:disabled{background-color:#C2C2C2;image:url(./icons/disable.png);}"));
	check->setChecked(init_status);

	layout->addWidget(check, 0, Qt::AlignLeft);
	layout->addWidget(label, 0, Qt::AlignLeft);
	layout->addStretch();

	connect(check, &QCheckBox::stateChanged, this, [=]() {
		call_back(check->isChecked());
		});

	checkItems.insert(title, formItem);
	addWidgetToForm(formItem);
}

void FormView::setItemEnabled(QString item_title, bool enabled)
{
	QWidget* w = editItems.value(item_title);
	if (w != nullptr)w->setEnabled(enabled);

	QWidget* w2 = checkItems.value(item_title);
	if (w2 != nullptr)w2->setEnabled(enabled);
}

QLineEdit* FormView::getEditableItem(QString title)
{
	QWidget* w = editItems.value(title);
	if (w == nullptr)return nullptr;
	return w->findChild<QLineEdit*>();
}

QCheckBox* FormView::getCheckableItem(QString title)
{
	QWidget* w = checkItems.value(title);
	if (w == nullptr)return nullptr;
	return w->findChild<QCheckBox*>();
}

void FormView::startForm()
{
	if (mainLayout == nullptr)mainLayout = new QVBoxLayout(this);
	mainLayout->addStretch();
}

void FormView::endForm()
{
	mainLayout->addStretch();
}

核心函数

函数 变量 功能
addEditableItem title: 输入框前面的提示文字,同时作为该控件的标识符
place_holder: 输入框中的提示文字
在表单中插入一个可填写项
addCheckableItem title: 不显示在UI中,仅作为该控件的标识符
content: 勾选框后面的内容
init_status: 勾选框的初始状态
call_back: 勾选状态变化后的回调函数
在表单中插入一个可勾选项

三、使用方法

1、纯代码使用

新建一个UITest类作为窗体,部分代码如下:

UITest::UITest(QWidget *parent)
	: QMainWindow(parent)
{
	Init();
	//ui.setupUi(this);
}

UITest::~UITest()
{}

void UITest::Init()
{
	int nScreenWidth = QApplication::primaryScreen()->geometry().width();
	int nScreenHeight = QApplication::primaryScreen()->geometry().height();
	setFixedSize(nScreenWidth * 0.8, nScreenHeight * 0.8);
	FormView* form = new FormView(nScreenWidth*0.2,nScreenHeight * 0.4,this);
}

然后再main函数中使其显示即可:

	UITest t;
	t.show();

2、在designer中使用

新建一个qt widget类,在UI中添加Widget控件并提升为FormView:
QT自定义优雅的表单控件,简单实现设置界面布局
需要注意的是,本表单工具仅能排成一列,若需要多列则应如图中所示设计多个表单控件。

3、添加表格内容

为避免表格内项目大小出错,建议在paintEvent中初始化表格:文章来源地址https://www.toymoban.com/news/detail-506056.html

void SettingsView::paintEvent(QPaintEvent* event)
{
	QWidget::paintEvent(event);
	if (!isInited)
	{
		InitUI();
	}
	
}
void SettingsView::InitUI()
{
	QSize size(40, 40);
	QPixmap mipmap_setting("./icons/setting_icon.png");
	ui.setting_icon->setPixmap(mipmap_setting.scaled(size));
	ui.btn_setting_confirm->setText(QStringLiteral("确认"));


	//left form
	//ui.settings_left->startForm();
	ui.settings_left->addEditableItem(QStringLiteral("参考站IP"), QStringLiteral("127.0.0.1"));
	ui.settings_left->addEditableItem(QStringLiteral("参考站端口"), QStringLiteral("8080"));
	ui.settings_left->addEditableItem(QStringLiteral("流动站IP"), QStringLiteral("127.0.0.1"));
	ui.settings_left->addEditableItem(QStringLiteral("流动站端口"), QStringLiteral("8080"));
	ui.settings_left->addEditableItem(QStringLiteral("卫星系统"), QStringLiteral("B&C&G&E"));
	ui.settings_left->addCheckableItem(QStringLiteral("偏差模式"), QStringLiteral("定位结果以偏差形式显示"), true,[=](bool ischecked) {
		ui.settings_left->setItemEnabled(QStringLiteral("流动站坐标X"), ischecked);
		ui.settings_left->setItemEnabled(QStringLiteral("流动站坐标Y"), ischecked);
		ui.settings_left->setItemEnabled(QStringLiteral("流动站坐标Z"), ischecked);
	});
	ui.settings_left->addEditableItem(QStringLiteral("流动站坐标X"), QStringLiteral("地心坐标系X轴"));
	ui.settings_left->addEditableItem(QStringLiteral("流动站坐标Y"), QStringLiteral("地心坐标系Y轴"));
	ui.settings_left->addEditableItem(QStringLiteral("流动站坐标Z"), QStringLiteral("地心坐标系Z轴"));
	ui.settings_left->endForm();

	//right form

	isInited = true;
	//fill forms
	fillForms();

}

到了这里,关于QT自定义优雅的表单控件,简单实现设置界面布局的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT在自定义类中调用主类(界面类ui及其控件)的一种实用方法

    在实际应用中,经常会出现需要自定义类访问界面中的控件的情况,使用信号和槽进行跳转往往过于繁琐,使用下述方法可以巧妙解决: 界面类 QtWidgetsTest.h QtWidgetsTest.cpp 自定义类 CustomClass.h 首先包含ui头文件(其实也可不写,因为cpp里一定会包含QtWidgetsTest.h并包含ui文件),

    2024年02月16日
    浏览(47)
  • web + servlet + jdbc mysql 实现简单的表单管理界面

    首先我们准备好开发使用的工具以及配置 idea2020 tomcat8.5 创建javaweb参考idea编译Tomcat详细步骤 IDEA通过JDBC连接数据库请参考jdbc连接数据库 需要登陆注册界面请参考web + servlet + jdbc mysql 实现简单的登陆注册界面 首先创建数据库temp 创建新的表单temperature 或者使用建表语句 插入数

    2023年04月08日
    浏览(41)
  • Qt自定义窗口部件/控件(实现一个十六进制微调框SpinBox)

    在某些情况下,我们发现Qt窗口控件需要更多的自定义定制,这些定制可能要比它在Qt设计师里可设置的属性或者对它调用的那些函数更多一些。一个简单而直接的解决方法就是对相关的窗口部件类进行子类化并且使它能够满足我们的需要。 本文主要是通过实现一个十六进制微调

    2024年02月11日
    浏览(43)
  • 基于JavaFX的扫雷游戏实现(五)——设置和自定义控件

      它来了它来了,最后一期终于来了。理论上该讲的全都讲完了,只剩下那个拖了好几期的自定义控件和一个比较没有存在感的设置功能没有讲。所以这次就重点介绍它们俩吧。   首先我们快速浏览下设置的实现,上图:   然后是控制器代码: SettingsController.java   

    2024年02月13日
    浏览(35)
  • 【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框

    往期回顾: 【QT入门】 Qt自定义控件与样式设计之qss选择器-CSDN博客 【QT入门】 Qt自定义控件与样式设计之QLineEdit的qss使用-CSDN博客 【QT入门】Qt自定义控件与样式设计之QPushButton常用qss-CSDN博客 鼠标悬浮弹出对话框的功能:最终要实现纯代码设计出一个音量按钮,当鼠标悬浮

    2024年04月23日
    浏览(41)
  • 素雅的登录界面,简单而优雅

    先上效果图: 再上代码:

    2024年02月05日
    浏览(33)
  • 【QT入门】 自定义标题栏界面qss美化+按钮功能实现

    往期回顾: 【QT入门】 鼠标按下和移动事件实现无边框窗口拖动-CSDN博客 【QT入门】 设计实现无边框窗口拉伸的公用类-CSDN博客 【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客 1、实现悬浮样式改变 当鼠标悬浮到该按钮上时,样式会有一定改变。 2、添加

    2024年04月10日
    浏览(72)
  • Qt中多ui使用及简单布局实现交互界面

    第一章 Qt中C++代码搭配UI文件实现交互界面 第二章 Qt中多ui使用及简单布局实现交互界面 文章目录 前言 一、新增两个新UI文件 二、使用这两个新增的UI及简单布局 三.添加简单联动逻辑 四.编译运行及动态效果展示 总结         前一段时间,写了一篇关于Qt中C++代码搭配

    2024年02月04日
    浏览(56)
  • Qt 重写QSlider简单实现滑动解锁控件(指定百分比回弹效果)

    组件效果图: 应用场景:  用于滑动解锁相关场景,Qt的控件鼠标监听机制对于嵌入式设备GUI可触摸屏依旧可用。 实现方式: 主要是通过继承QSlider以及搭配使用QStyleOptionSlider来实现效果。 注意细则: QStyleOptionSlider是用于定制空白区域是否可移动滑块,根据需求可舍弃。 组

    2024年02月07日
    浏览(39)
  • 安卓开发——控件AlertDialog实现方式,设置下部三个按钮,自定义布局设置.setView(dialogView)样式,控件PopupWindow1常用方法,showAsDropDown构造方法

     AlertDialog . Builder builder = new AlertDialog . Builder ( context ); 构建 Dialog 的各种参数  Builder . setlcon ( int iconld ); 添加 ICON   Builder . setTitle ( CharSequence title ); 添加标题  Builder . setMessage ( CharSequence message ); 添加消息  Builder . setView ( View view ); 设置自定义布

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包