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

  • 11
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Qt是一款流行的跨平台开发框架,可以用于开发各种类型的应用程序,包括智能家居系统。Qt提供了丰富的图形界面和应用程序逻辑开发工具,使得开发者可以轻松地创建用户友好的智能家居应用。以下是Qt作为简易智能家居框架的几个特点: 1. 跨平台性:Qt支持多种操作系统,如Windows、Linux和macOS,可以在不同的设备上运行,比如台式电脑、智能手机和平板电脑。这意味着开发者可以使用同一套代码来实现智能家居应用的跨平台兼容性,减少开发工作量。 2. 图形界面设计:Qt提供了丰富的图形界面设计工具,开发者可以使用Qt的可视化编辑器来创建用户友好的界面。智能家居系统通常需要一个易于操作的界面来控制家里的各种设备,Qt的图形界面设计工具可以帮助开发者轻松创建这样的界面。 3. 功能丰富的库:Qt提供了许多现成的功能库,如网络通信、数据库访问、多媒体处理等。这些功能库可以帮助开发者快速构建智能家居系统的各个模块,如设备控制、场景切换和数据存储。 4. 强大的事件处理机制:智能家居系统需要对各种事件进行处理,如用户的点击、设备的状态变化等。Qt提供了灵活的事件处理机制,可以方便地响应和处理这些事件,使得智能家居系统更加智能和灵活。 总之,Qt作为简易智能家居框架,具有跨平台性、图形界面设计、功能丰富的库和强大的事件处理机制等优势,可以帮助开发者快速创建用户友好、功能强大的智能家居应用程序。 ### 回答2: Qt是一种流行的跨平台开发框架,它为开发人员提供了丰富的工具和功能,使他们能够创建各种各样的应用程序。在智能家居领域,Qt可以作为一种简易的框架来构建智能家居解决方案。 首先,Qt具有跨平台的特性,这意味着开发人员可以使用同一套代码在不同的操作系统上运行其应用程序。这对于智能家居系统非常重要,因为它们通常需要在多个设备和平台上运行。使用Qt开发人员可以轻松地开发一次,并在不同平台上部署他们的应用程序。 其次,Qt提供了易于使用的图形用户界面(GUI)工具,使开发人员能够快速创建各种控件和界面元素。在智能家居系统中,有许多不同的设备和传感器需要进行交互和控制。Qt的GUI工具可以帮助开发人员创建直观和易于使用的用户界面,使用户可以轻松地管理和控制智能设备。 此外,Qt还提供了丰富的网络功能,使开发人员能够建立连接和通信。在智能家居系统中,各种设备和传感器需要相互通信,以实现自动化和远程控制。Qt的网络功能可以帮助开发人员轻松地建立设备之间的连接,实现数据传输和控制命令的发送。 最后,Qt还提供了强大的多媒体功能,可以用于处理音频和视频数据。在智能家居系统中,多媒体功能可以用于实现音乐播放、视频监控等功能。Qt的多媒体功能可以帮助开发人员轻松地处理和管理多媒体数据,为用户提供更好的体验。 综上所述,Qt作为一种简易的智能家居框架,具有跨平台能力、易用的GUI工具、丰富的网络功能和强大的多媒体功能。开发人员可以使用Qt来快速构建智能家居系统,并为用户提供更好的体验。 ### 回答3: Qt是一种跨平台的应用程序开发框架,简易智能家居框架指的是利用Qt开发的一种简单且智能的家居控制系统。这个框架可以让用户通过使用智能设备或者手机等终端设备来控制家中的各种设备,实现智能化的生活。 首先,这个框架可以提供一个直观易用的用户界面,让用户可以通过简单的操作就能控制家中各种设备。用户可以通过界面来控制灯光、温度、音乐、电视等各种家居设备的开关、亮度、颜色等参数。用户可以根据自己的需求自由定制界面的布局和样式,使其更符合个人喜好。 其次,这个框架可以实现智能化的控制逻辑。通过与传感器和执行器的连接,框架可以获取环境信息,例如温度、湿度、光线强度等,并根据用户的设定来智能地调节相应的家居设备。比如,可以设置在特定的时间或者特定的天气条件下自动开关灯光,或者根据家庭成员的习惯自动调整空调的温度,提高生活的舒适性。 另外,这个框架还可以实现设备之间的互联互通。通过适配不同的通信协议,比如Wi-Fi、蓝牙、红外等,框架可以将不同品牌、不同类型的智能设备连接在一起,并进行数据交换和联动控制。用户可以通过一个终端设备同时控制多个智能设备,实现一键控制多个设备的功能。 最后,这个框架还可以提供数据统计和分析的功能。框架可以记录各种设备的使用情况,并通过数据分析来提供用户的使用习惯和偏好,以及家居设备的能耗情况等信息,帮助用户优化家居设备的使用,节省能源和成本。 总之,Qt简易智能家居框架提供了丰富的功能和智能化的操作,使用户可以更加方便地控制家中的设备,提高生活的舒适度和便捷性。它不仅满足用户对智能家居的需求,还可以帮助用户节约能源和成本,是一种十分实用的智能家居解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的大海贼

联系博主,为您提供有价值的资源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值