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

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

  • 前言
  • 一、演示效果
  • 二、配置说明
  • 三、关键程序
  • 四、程序下载


前言

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

一、演示效果

QT-通用的软件界面框架,好看且实用_第1张图片

QT-通用的软件界面框架,好看且实用_第2张图片

二、配置说明

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

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

QT-通用的软件界面框架,好看且实用_第7张图片

三、关键程序

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 
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 
#include 
#include 
#include 

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

你可能感兴趣的:(Qt,qt,ui,开发语言)