前言
常規(guī)軟件開發(fā),使用這種界面框架,基本是可以做很多個(gè)常規(guī)項(xiàng)目,比較有參考意義。
本次軟件使用開發(fā)的環(huán)境是QT5.13.2+VS2017,不同的開發(fā)環(huán)境重新配置即可。
一、演示效果
二、配置說明
1、軟件框架結(jié)構(gòu)說明,不同界面獨(dú)立不同的庫來調(diào)用。
2、屬性配置
(1)添加包含目錄:$(SolutionDir)
(2)添加庫依賴
2、控件升級(jí)
三、關(guān)鍵程序
1、主程序內(nèi)容
#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()
{
// 去掉原來的標(biāo)題欄
this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::MaximizeUsingFullscreenGeometryHint);
ui.btnMax->setVisible(false);
// 綁定按鍵和界面之間的關(guān)系
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]);
// 綁定信號(hào)槽
auto btns = m_btnWidgetMap.keys();
for (auto pBtn : btns)
{
connect(pBtn, SIGNAL(clicked()), this, SLOT(slotPageChange()));
}
//默認(rèn)選中第一個(gè)界面
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());
}
}
//初始化信號(hào)槽
void QSoftFrame::initialSingleSlot()
{
//最小化
connect(ui.btnMin, &QToolButton::released, this, &QMainWindow::showMinimized);
//軟件關(guān)閉
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);
});
}
// 設(shè)置頁面按鍵狀態(tài)
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、可拖動(dòng)標(biāo)題欄
#include "QWidgetTiltle.h"
QWidgetTiltle::QWidgetTiltle(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
QWidgetTiltle::~QWidgetTiltle()
{
}
void QWidgetTiltle::mousePressEvent(QMouseEvent *event)
{
//鼠標(biāo)左鍵按下事件
if (event->button() == Qt::LeftButton)
{
//記錄鼠標(biāo)左鍵狀態(tài)
m_leftButtonPressed = true;
//記錄鼠標(biāo)在屏幕中的位置
m_start = event->globalPos();
}
}
void QWidgetTiltle::mouseMoveEvent(QMouseEvent *event)
{
if (m_leftButtonPressed)
{
//將父窗體移動(dòng)到父窗體原來的位置加上鼠標(biāo)移動(dòng)的位置:event->globalPos()-m_start
this->window()->move(this->window()->geometry().topLeft() + event->globalPos() - m_start);
//將鼠標(biāo)在屏幕中的位置替換為新的位置
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
{
//不是最大化的時(shí)候,雙擊最大化
this->window()->showMaximized();
}
}
3、滾動(dòng)式提示標(biāo)簽文章來源:http://www.zghlxwxcb.cn/news/detail-503903.html
#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);
// 設(shè)置即將繪制文字的字體
QFont ft = font();
ft.setBold(false);
ft.setPointSize(fontSize);
p.setFont(ft);
p.setPen(QPen(Qt::white));
// 設(shè)置繪制文字的開始位置,也就是將文字往左移動(dòng)多少
rc.setLeft(rc.left() - left);
// 如果文字已經(jīng)顯示到末尾,則再添加一遍文字,做出循環(huán)滾動(dòng)的效果
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個(gè)像素
left += 1;
// 判斷是否已經(jīng)完成一遍循環(huán),完成則恢復(fù)起始位置,重新開始循環(huán)
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()
{
// 獲取文本大小,小于文本框長度,則無需滾動(dòng)
QFont ft = font();
ft.setPointSize(fontSize);
QFontMetrics fm(ft);
int nW = fm.width(text());
left = 0;
// 開啟文本框滾動(dòng)
if(nW > width())
{
timerId = startTimer(100);
}
// 關(guān)閉文本框滾動(dòng)
else
{
if(timerId >= 0)
{
killTimer(timerId);
timerId = -1;
}
}
}
四、程序下載
https://download.csdn.net/download/u013083044/87558246?spm=1001.2014.3001.5503文章來源地址http://www.zghlxwxcb.cn/news/detail-503903.html
到了這里,關(guān)于QT-通用的軟件界面框架,好看且實(shí)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!