QT-通用的软件界面框架,好看且实用

2023-11-04

QT-通用的软件界面框架,好看且实用


前言

常规软件开发,使用这种界面框架,基本是可以做很多个常规项目,比较有参考意义。
本次软件使用开发的环境是QT5.13.2+VS2017,不同的开发环境重新配置即可。

一、演示效果

请添加图片描述

在这里插入图片描述

二、配置说明

1、软件框架结构说明,不同界面独立不同的库来调用。
在这里插入图片描述

2、属性配置
(1)添加包含目录:$(SolutionDir)
在这里插入图片描述
(2)添加库依赖
在这里插入图片描述
2、控件升级
在这里插入图片描述

在这里插入图片描述

三、关键程序

1、主程序内容

#include "QSoftFrame.h"
#include "Page/PageHelpWidget/PageHelpWidget.h"
#include "Page/PageLogWidget/PageLogWidget.h"
#include "Page/PageMainWidget/PageMainWidget.h"
#include "Page/PageMinitorWidget/PageMinitorWidget.h"
#include "Page/PageSetingWidget/PageSetingWidget.h"

#include <QFile>
QSoftFrame::QSoftFrame(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	initialUI();
	initialSingleSlot();
	initialQss();
}

//初始化UI
void QSoftFrame::initialUI()
{
	// 去掉原来的标题栏
	this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::MaximizeUsingFullscreenGeometryHint);
	ui.btnMax->setVisible(false);

	// 绑定按键和界面之间的关系
	m_btnWidgetMap.insert(ui.btnMain, PageMainWidget());
	m_btnWidgetMap.insert(ui.btnLog, PageLogWidget());
	m_btnWidgetMap.insert(ui.btnHelp, PageHelpWidget());
	m_btnWidgetMap.insert(ui.btnSet, PageSetingWidget());
	m_btnWidgetMap.insert(ui.btnMinitor, PageMinitorWidget());

	ui.stackedWidget->addWidget(m_btnWidgetMap[ui.btnMain]);
	ui.stackedWidget->addWidget(m_btnWidgetMap[ui.btnLog]);
	ui.stackedWidget->addWidget(m_btnWidgetMap[ui.btnHelp]);
	ui.stackedWidget->addWidget(m_btnWidgetMap[ui.btnSet]);
	ui.stackedWidget->addWidget(m_btnWidgetMap[ui.btnMinitor]);

	// 绑定信号槽
	auto btns = m_btnWidgetMap.keys();
	for (auto pBtn : btns)
	{
		connect(pBtn, SIGNAL(clicked()), this, SLOT(slotPageChange()));
	}

	//默认选中第一个界面
	ui.btnMain->clicked();

}

//切换不同页面
void QSoftFrame::slotPageChange()
{
	QToolButton *pBtn = (QToolButton*)sender();
	setPageBtnsCheckState(false);
	pBtn->setChecked(true);

	//有找到Widget就切换
	auto item = m_btnWidgetMap.find(pBtn);
	if (item != m_btnWidgetMap.end())
	{
		ui.stackedWidget->setCurrentWidget(item.value());
	}

}

//初始化信号槽
void QSoftFrame::initialSingleSlot()
{
	//最小化
	connect(ui.btnMin, &QToolButton::released, this, &QMainWindow::showMinimized);

	//软件关闭
	connect(ui.btnClose, &QToolButton::released, this, [&]() {
		this->close();
	});

	//最大化
	connect(ui.btnMax, &QToolButton::released, this, [&]() {
		this->showMaximized();
		ui.btnMax->setVisible(false);
		ui.btnRestore->setVisible(true);
	});

	//重置界面
	connect(ui.btnRestore, &QToolButton::released, this, [&]() {
		this->showNormal();
		ui.btnMax->setVisible(true);
		ui.btnRestore->setVisible(false);
	});
}

// 设置页面按键状态
void QSoftFrame::setPageBtnsCheckState(bool bCheck)
{
	ui.btnMain->setChecked(bCheck);
	ui.btnLog->setChecked(bCheck);
	ui.btnHelp->setChecked(bCheck);
	ui.btnSet->setChecked(bCheck);
	ui.btnMinitor->setChecked(bCheck);
}

//初始化样式
void QSoftFrame::initialQss()
{
	QString fileName = QString(":/Resource/App.qss");
	QFile file(fileName);
	if (file.open(QFile::ReadOnly))
	{
		QString qss = QLatin1String(file.readAll());
		this->setStyleSheet(qss);
		file.close();
	}

}

//显示事件
void QSoftFrame::showEvent(QShowEvent *event)
{
	//添加WA_Mapped属性,防止界面卡死
	this->setAttribute(Qt::WA_Mapped);
	QMainWindow::showEvent(event);

}

//界面大小重置界面
void QSoftFrame::resizeEvent(QResizeEvent *event)
{
	if (this->isMaximized())
	{
		ui.btnMax->setVisible(false);
		ui.btnRestore->setVisible(true);
	}
	else if (this->isMinimized())
	{
	}
	else if (this->isFullScreen())
	{
	}
	else
	{
		ui.btnMax->setVisible(true);
		ui.btnRestore->setVisible(false);
	}
}

2、可拖动标题栏

#include "QWidgetTiltle.h"

QWidgetTiltle::QWidgetTiltle(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
}

QWidgetTiltle::~QWidgetTiltle()
{
}

void QWidgetTiltle::mousePressEvent(QMouseEvent *event)
{
	//鼠标左键按下事件
	if (event->button() == Qt::LeftButton)
	{
		//记录鼠标左键状态
		m_leftButtonPressed = true;

		//记录鼠标在屏幕中的位置
		m_start = event->globalPos();
	}
}

void QWidgetTiltle::mouseMoveEvent(QMouseEvent *event)
{
	if (m_leftButtonPressed)
	{
		//将父窗体移动到父窗体原来的位置加上鼠标移动的位置:event->globalPos()-m_start
		this->window()->move(this->window()->geometry().topLeft() + event->globalPos() - m_start);

		//将鼠标在屏幕中的位置替换为新的位置
		m_start = event->globalPos();
	}
}

void QWidgetTiltle::mouseReleaseEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton)
	{
		m_leftButtonPressed = false;
	}
}

// 双击切换界面
void QWidgetTiltle::mouseDoubleClickEvent(QMouseEvent *event)
{
	Q_UNUSED(event);
	if (this->window()->isMaximized())
	{
		//显示正常的窗口
		this->window()->showNormal();
	}
	else
	{
		//不是最大化的时候,双击最大化
		this->window()->showMaximized();
	}
	
}

3、滚动式提示标签

#include "HLabelEx.h"
#include <QPainter>
#include <QTimer>
#include <QFontMetrics>
#include <QTimerEvent>

const QString strSpace("   ");

HLabelEx::HLabelEx(QWidget *parent) : QLabel(parent)
{
    timerId = -1;
    fontSize = 11;
}

void HLabelEx::setText(const QString & txt)
{
    QLabel::setText(txt);

    upateLabelRollingState();
}

void HLabelEx::paintEvent(QPaintEvent *e)
{
    QPainter p(this);

    //  获取文本框的大小
    QRect rc = rect();
    rc.setHeight(rc.height() - 2);
    rc.setWidth(rc.width() - 2);

    //  设置即将绘制文字的字体
    QFont ft = font();
	ft.setBold(false);
    ft.setPointSize(fontSize);
    p.setFont(ft);
    p.setPen(QPen(Qt::white));
	

    //  设置绘制文字的开始位置,也就是将文字往左移动多少
    rc.setLeft(rc.left() - left);

    //  如果文字已经显示到末尾,则再添加一遍文字,做出循环滚动的效果
    QString strText = text();
    if(timerId >= 0)
        strText += strSpace + text();

    //  绘制文字
    p.drawText(rc, Qt::AlignVCenter, strText);
}

void HLabelEx::timerEvent(QTimerEvent *e)
{
    if(e->timerId() == timerId && isVisible())
    {
        //  每次左移1个像素
        left += 1;

        //  判断是否已经完成一遍循环,完成则恢复起始位置,重新开始循环
        QFont ft = font();
        ft.setPointSize(fontSize);
        QFontMetrics fm(ft);
        int txtWidth = fm.width(text());
        int spaceWidth = fm.width(strSpace);

        if((txtWidth + spaceWidth) < left)
            left = 0;

        repaint();
    }

    QLabel::timerEvent(e);
}

void HLabelEx::resizeEvent(QResizeEvent *e)
{
    QLabel::resizeEvent(e);

    upateLabelRollingState();
}

void HLabelEx::upateLabelRollingState()
{
    //  获取文本大小,小于文本框长度,则无需滚动
    QFont ft = font();
    ft.setPointSize(fontSize);

    QFontMetrics fm(ft);
    int nW = fm.width(text());

    left = 0;
    //  开启文本框滚动
    if(nW > width())
    {
        timerId = startTimer(100);
    }
    //  关闭文本框滚动
    else
    {
        if(timerId >= 0)
        {
            killTimer(timerId);
            timerId = -1;
        }
    }
}

四、程序下载

https://download.csdn.net/download/u013083044/87558246?spm=1001.2014.3001.5503

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

QT-通用的软件界面框架,好看且实用 的相关文章

  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 禁用 QML Slider 的鼠标滚轮

    我希望能够滚动Flickable使用鼠标滚轮 或触摸板上的两根手指 不改变Sliders它可能包含 示例代码及结果应用 import QtQuick 2 7 import QtQuick Window 2 2 import QtQuick
  • 错误 LNK2001:无法解析的外部符号 __CxxFrameHandler3

    我正在将 Qt 从 VS 2013 迁移到 Qt 5 10 1 到 VS 2015 出现以下多个链接错误 error LNK2001 unresolved external symbol CxxFrameHandler3 error LNK
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 向 Qt 样式表添加特异性时丢失样式

    这是我的代码 const QString STYLE SHEET background color rgba x x x y border 1px solid gray border radius 0px border top 1px so
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • 无法在带有 QSortFilterProxyModel 的 QTreeView 的点击信号中使用 itemFromIndex

    我有一个 QTreeView 在视图和 QStandardItemModel 之间有一个 QSortFilterProxyModel 来对树进行排序 然后我想通过 clicked 信号对视图中的点击进行操作 模型 视图的设置类似于 mymo
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 从 Qt4 中的文本文件中逐字读取

    我想在 Qt4 中逐字读取一个文本文件 说实话我对它很陌生 我想在另一个文件中每行一个字写入 我可以在 C 中做到这一点 没有任何问题 但是当我尝试在 Qt4 中使用 ifstream 和 ofstream 时 我遇到了错误 这是我的 Qt
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 如何消除 QTableWidget 中的空白?

    How do I get rid of the whitespace in my application 我想摆脱 QTableWidget 中的空白 蓝色箭头 我该怎么做 这是我的应用程序的代码 gridLayout QGridLayou
  • 为什么 QGraphicsWidget 的选择边框在 QGraphicsScene 中不可见?

    我已经通过一个小部件添加到图形场景 QGraphicSscene QGraphicsProxyWidget 问题是 当我选择该项目时 它被选中 但选择边框不可见 这是代码 QDial dial new QDial Widget dial g

随机推荐

  • 前端项目基本流程

    1 需求分析 针对于将要开发的项目 由产品经理沟通需求方之后 对应研发部给出相应的设计理念 业务流程逻辑 原型图 界面交互需求 多场景业务需求等所设计的产品PRD 在研发部门会议中商讨评审 共同协商产品需求所需的技术支持及分析相应的需求的合
  • 《CenterMask:Real-Time Anchor-Free Instance Segmentation》论文笔记

    代码地址 CenterMask 1 概述 导读 在这篇文章提出的新instance分割方法是基于FCOS的 首先 文章在FOCS的box检测的基础上通过添加一个SAG Mask spatial attention guided mask 分
  • Nginx 核心模块与配置实践

    Nginx 安装与普通演示 pcre 8 35 tar gz nginx 1 6 2 tar gz 环境安装 yum y install make zlib zlib devel gcc c libtool openssl openssl
  • 四、随机访问(IOPS)性能测试

    我们先来看看随机读应用的特点 在队列深度为1时 相当于单线程访问 此时的IOPS基本相当于单块硬盘每秒钟的寻道 等待次数 即平均访问时间的倒数 当队列深度不断增加 每块硬盘的NCQ 本地命令排队 功能和硬盘的数量开始发挥作用 队列深度达到2
  • [安全攻防进阶篇] 八.那些年的熊猫烧香及PE病毒行为机理分析

    如果你想成为一名逆向分析或恶意代码检测工程师 或者对系统安全非常感兴趣 就必须要认真分析一些恶意样本 熊猫烧香病毒就是一款非常具有代表性的病毒 当年造成了非常大的影响 并且也有一定技术手段 本文将详细讲解熊猫烧香的行为机理 并通过软件对其功
  • 【蓝桥杯】第十三届蓝桥杯省赛 AK 攻略 —— C++ B组全真题超详细剖析

    目录 写在前面 A题 九进制转十进制 题目描述 解题思路 代码编写 B题 顺子日期 题目描述 解题思路 代码编写 C题 刷题统计 题目描述 解题思路 代码编写 D题 修剪灌木 题目描述 解题思路 代码编写 E题 X进制减法 题目描述 解题思
  • PyQt5中的lambda表达式的使用

    一般我们在PyQt5中使用按钮的点击事件一般是以下这种写法 self button clicked connect self btnClick 但是当需要传递参数时 就傻眼了 此时就用到了我们的标题lambda表达式 self button
  • JavaScript从键盘输入三个整数分别存入变量,从小到大进行排序

    键盘输入prompt prompt 方法用于显示可提示用户进行输入的对话框 这个方法返回用户输入的字符串 所以对输入的数字要进行类型转换 var num1 prompt 请输入第一个数 var num2 prompt 请输入第二个数 var
  • AI与大数据的关系

    最近在忙着专业分流的事情 自己纠结的专业主要就是人工智能和大数据 找了很多资料 终于整理出二者的关系 原文地址 https www sohu com a 224177824 764294 更专业一些的分析可以看这篇文章 https blog
  • 校园网开热点显示无Internet连接和360免费WiFi猎豹WiFi冲突解决办法

    校园网开不了热点或者用360免费WiFi发生冲突 问题 校园网 连接后有网络显示无Internet连接 也开不了热点 解决方法 方法一 使用像360免费WiFi类的软件进行开热点 同时你需要开启校园网模式 开启校园网模式 校园网模式可以避免
  • 与fo论禅汇总

    与佛论禅网络上现在共包含三个版本 与佛论禅 与佛论禅 与佛论禅重制版 与佛论禅重制版 Takuron 新与佛论禅 新约佛论禅 佛曰加密 PcMoe 有几个注意点 1 别拿百度引擎 翻墙拿谷歌 2 三个网站的使用逻辑不同 加密解密的输入框不一
  • Zookeeper已经分布式环境中的假死脑裂

    Zookeeper简介 在上班之前都不知道有这样一个东西 在开始说假死脑裂之前先说说Zookeeper吧 Zookeeper zookeeper是一个分布式应用程序的协调服务 它是一个为分布式应用提供一致性服务的软件 提供的性能包括 配置维
  • 基本数据类型强制转换问题-值的截断和内存的截断

    1 double a1 22 32 int b1 int a1 2 double a2 2 5e20 int b2 int a2 按照浮点数到整数的转换语义 结果应该截去浮点数的小数部分 而保留整数部分 所以b1应该为22 而b2则超出了其
  • 刷脸支付可针对客户做二次营销活动

    随着智能手机和WIFI的普及 80 的顾客都不再拿钱包 而是掏出手机付款 大到商店小到早点摊菜市场 只要拿出手机轻轻一扫 便可以完成整个购买流程 而如今 支付4 0时代已经到来 基于生物识别技术 不用手机 万物可付 李嘉诚说 当一项新鲜事物
  • MySQL高级篇-第06章_索引的数据结构

    1 为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构 就好比一本数课书的目录部分 通过目录中找到对应文章的页码 便可快速定位到需要的文章 MySQL中也是一样的道理 进行数据查找时 首先查看查询条件是否命中某条索引 符合则通
  • 找第一个只出现一次的字符c++

    找第一个只出现一次的字符 提交数 3563 通过率 43 14 平均分 61 55 题目描述 给定一个只包含小写字母的字符串 请你找到第一个仅出现一次的字符 如果没有 输出no 输入格式 一个字符串 长度小于100000 输出格式 输出第一
  • rabbitmq初学之连接测试

    最近在搞接口 需要用到rabbitmq 在公司搞了一个下午还是连接不上 后来细看了英文说明 测试连接成功 得出如下报错几点 我用的安装包 otp win64 17 0 exe erlang vm 和rabbitmq server 3 3 1
  • 消息队列-kafka入门详解

    本文适用于初学者 学习kafka之前 应该都知道它是消息队列 但是和我们印象中数据结构的队列不同的是 它持久化到磁盘上 1 我们首先从定义来看 Kafka 一个分布式的 分区化 可复制提交的日志服务 我们先来想想什么是分区 好比图书馆的书
  • pcb过孔与电流对照一览表_PCB设计项目能不能成功,这个因素占了30%

    电源平面的处理 在PCB设计中占有很重要的地位 在一个完整的设计项目中 通常电源的处理决定项目的30 50 的成功率 本次给大家介绍在PCB设计过程中电源平面处理应该考虑的基本要素 1 做电源处理时 首先应该考虑其载流能力 其中包含2个方面
  • QT-通用的软件界面框架,好看且实用

    QT 通用的软件界面框架 好看且实用 前言 一 演示效果 二 配置说明 三 关键程序 四 程序下载 前言 常规软件开发 使用这种界面框架 基本是可以做很多个常规项目 比较有参考意义 本次软件使用开发的环境是QT5 13 2 VS2017 不