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

这篇具有很好参考价值的文章主要介绍了QT-通用的软件界面框架,好看且实用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

一、演示效果

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

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

二、配置说明

1、软件框架结构说明,不同界面独立不同的库来调用。
QT-通用的软件界面框架,好看且实用

2、属性配置
(1)添加包含目录:$(SolutionDir)
QT-通用的软件界面框架,好看且实用
(2)添加库依赖
QT-通用的软件界面框架,好看且实用
2、控件升级
QT-通用的软件界面框架,好看且实用

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

三、关键程序

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文章来源地址https://www.toymoban.com/news/detail-503903.html

到了这里,关于QT-通用的软件界面框架,好看且实用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 界面开发框架Qt新手入门教程:Dir视图使用实例

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 本示例演示了树形视图的用

    2024年02月08日
    浏览(51)
  • [QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

    目录 2. QT程序的运行框架 2.1 Hello World程序框架 2.2 QT Designer初识 2.3 用QT Designer设计用户登录界 上述示例代码中,首先根据应用程序的需求使用 QCoreApplication 或 QApplication 定义 app 对象。如果你的应用程序需要图形界面,则使用 QApplication,否则使用 QCoreApplication。然后,你可以

    2024年02月15日
    浏览(52)
  • 好看的html登录界面,

    界面效果: 代码:

    2023年04月09日
    浏览(45)
  • 界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)

    Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 点击获取Qt Widget组件下载 (Q技术交流:166830288) 树项

    2024年02月06日
    浏览(60)
  • OA系统登录界面(比较好看)

    2024年02月15日
    浏览(40)
  • C++界面开发框架Qt 6.x入门指南 - 拥有程序主窗口

    Qt技术交流群:166830288      欢迎一起进群讨论 点击获取Qt组件下载 Qt Widget 是桌面环境中典型的用户界面元素,这些小部件很好地集成到底层平台,在 Windows、Linux 和 macOS 上提供原生外观。 这些小部件成熟且具有丰富的用户界面元素,适用于大多数传统用户界面。 与 

    2024年02月05日
    浏览(47)
  • 80.qt qml-QianWindow炫酷界面框架-新增Canvas动态背景

    如下图所示:    动图如下所示: 如果我们使用图片,对于分辨率大的显示时,如果图片太小会失真,如果图片太大会占用很大内存,而且如果是动态图背景,那么至少40MB大小了. 所以我们增加Canvas动态背景功能,而且Canvas还可以根据系统性能我们来进行内部代码优化.比单色背景有趣的

    2024年02月05日
    浏览(39)
  • 一个好看美观的登录注册界面的实现

    序言:之前介绍那个博客,然后自己搞了这个界面。最近有人和我要,把代码给大家贴出来,提供参考。 首先是这个界面哈 然后呢,有那个javascript,就是绑定的登录注册时写在外部文件中的。我给大家贴上。 注意啊上面一个登录一个注册。 这里同样给出后端代码,就是我们

    2024年02月11日
    浏览(48)
  • HTML 实现好看的登录注册界面(一)

    2024年02月09日
    浏览(54)
  • vue+element ui实现好看的登录界面

    闲暇之余使用vue+element ui制作了个登录界面 话不多说,先上图 下面直接上代码: 附加背景图片 喜欢的老爷们可以给小弟一键三连哦,后续小弟还会发更多作品

    2024年02月11日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包