您的位置:首页 > 编程语言 > Qt开发

QT 扁平化界面风格,自定义TabWidget控件

2017-03-02 16:01 696 查看
直接上图先看效果:



核心代码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtCharts>
QT_CHARTS_USE_NAMESPACE

#include <QMainWindow>
#include <QMdiArea>
#include <QToolButton>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
QChart *tpChart;             //定义一个图表
QMdiArea *tpMdiArea;         //TabWidget子窗口
QLineSeries *CH1series;      //通道1按钮线
QLineSeries *CH2series;      //通道2按钮线
QLineSeries *CH3series;      //通道3按钮线
QLineSeries *CH4series;      //通道4按钮线
QLineSeries *CH5series;      //通道5按钮线
QLineSeries *CH6series;      //通道6按钮线
QLineSeries *CH7series;      //通道7按钮线
QLineSeries *CH8series;      //通道8按钮线
QGraphicsSimpleTextItem *m_coordX;  //鼠标在图表上的X位置
QGraphicsSimpleTextItem *m_coordY;  //鼠标在图表上的Y位置
QPushButton  *changeBtn;
QToolButton  *closeBtn;
QToolBar     *mainToolBar;          //主工具栏
QAction      *actionFile;           //工具栏文件按钮
QAction      *actionTestPro;        //工具栏测量工程按钮
QAction      *actionForceStart;     //工具栏强制触发按钮
QAction      *actionRealTimeData;   //工具栏实时数据按钮
QAction      *actionStart;          //工具栏启动按钮
QAction      *actionStartN;         //工具栏多次启动按钮
QAction      *actionStop;           //工具栏停止按钮
QAction      *actionStore;          //工具栏存储按钮
QAction      *actionTestPara;       //工具栏测量参数按钮

public:
void WriteSettings();
void ReadSettings();
void init_sig_slots();
void uninit_sig_slots();
private slots:
void on_clickCH();
void on_changeBtn_clicked();
void timerSingleClick();            //定时器事件,处理单击任务
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
public:
QTimer* pQTimerDoubleClicked;       //判断单双击的定时器
int     isDoubleClicked;            //区分是单击还是双击
bool    isEnabledCH1series;         //通道1是否正在绘图
bool    isEnabledCH2series;         //通道2是否正在绘图
bool    isEnabledCH3series;         //通道3是否正在绘图
bool    isEnabledCH4series;         //通道4是否正在绘图
bool    isEnabledCH5series;         //通道5是否正在绘图
bool    isEnabledCH6series;         //通道6是否正在绘图
bool    isEnabledCH7series;         //通道7是否正在绘图
bool    isEnabledCH8series;         //通道8是否正在绘图
bool    m_Drag;                     //判断鼠标左键是否按下
QPoint  m_DragPosition;             //拖动窗口的位置
};

#endif // MAINWINDOW_H


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSettings>
#include <QDebug>
#include <QTextCodec>
#include <QLineSeries>
#include <QSplineSeries>
#include <QGraphicsScene>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
m_coordX(0),
m_coordY(0),
tpChart(0),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
tpMdiArea = new QMdiArea;
this->setCentralWidget(tpMdiArea);
QMdiSubWindow *subWin = new QMdiSubWindow;
subWin->setWidget(ui->tabWidget);

subWin->setAttribute(Qt::WA_DeleteOnClose);
tpMdiArea->addSubWindow(subWin);

subWin->setWindowFlags(Qt::FramelessWindowHint);
subWin->show();

//ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
ui->tabWidget->setTabText(2,tr("C:\\MyData\\Test.wav"));

tpChart = new QChart;
tpChart->setTitle("TP System Chart");
ui->chart->setFixedWidth(1200);
ui->chart->setFixedHeight(400);
ui->chart->setChart(tpChart);
ui->tabWidget->setFixedWidth(1400);

m_coordX = new QGraphicsSimpleTextItem(tpChart);
m_coordX->setPos(tpChart->size().width()/2 - 50, tpChart->size().height());
m_coordX->setText("X: ");
m_coordY = new QGraphicsSimpleTextItem(tpChart);
m_coordY->setPos(tpChart->size().width()/2 + 50, tpChart->size().height());
m_coordY->setText("Y: ");
for(int i=0; i<ui->tabWidget->count(); i++)
{
changeBtn = new QPushButton;
QIcon button_icogrey("images/greyIco.png");
changeBtn->setObjectName("btnC"+QString::number(i));
changeBtn->setMinimumSize(16,16);
changeBtn->setMaximumSize(16,16);
changeBtn->setIcon(button_icogrey);

changeBtn->setIconSize(QSize(16,16));
QObject::connect(changeBtn, SIGNAL(clicked(bool)),this,SLOT(on_changeBtn_clicked()));
ui->statusBar->addWidget(changeBtn);
}
isDoubleClicked = 0; //初始化不点击
pQTimerDoubleClicked = new QTimer(this); //新建定时器
isEnabledCH1series = false;
isEnabledCH2series = false;
isEnabledCH3series = false;
isEnabledCH4series = false;
isEnabledCH5series = false;
isEnabledCH6series = false;
isEnabledCH7series = false;
isEnabledCH8series = false;

//初始化工具栏和对应的图标
mainToolBar = new QToolBar(this);
actionFile = new QAction(this);
actionFile->setIcon(QIcon(":/images/file.png"));
actionTestPro = new QAction(this);
actionTestPro->setIcon(QIcon(":/images/testProject.png"));
actionForceStart = new QAction(this);
actionForceStart->setIcon(QIcon(":/images/forceS.png"));
actionRealTimeData = new QAction(this);
actionRealTimeData->setIcon(QIcon(":/images/realTimedata.png"));
actionStart = new QAction(this);
actionStart->setIcon(QIcon(":/images/start.png"));
actionStartN = new QAction(this);
actionStartN->setIcon(QIcon(":/images/startN.png"));
actionStop = new QAction(this);
actionStop->setIcon(QIcon(":/images/stop.png"));
actionStore = new QAction(this);
actionStore->setIcon(QIcon(":/images/store.png"));
actionTestPara = new QAction(this);
actionTestPara->setIcon(QIcon(":/images/testPara.png"));
//创建主工具栏按钮
mainToolBar->addAction(actionFile);
mainToolBar->addAction(actionTestPro);
mainToolBar->addAction(actionForceStart);
mainToolBar->addAction(actionRealTimeData);
mainToolBar->addAction(actionStart);
mainToolBar->addAction(actionStartN);
mainToolBar->addAction(actionStop);
mainToolBar->addAction(actionStore);
mainToolBar->addAction(actionTestPara);
mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

ReadSettings();//读取配置文件 工具栏按钮文字信息
//    QLabel *Titlelabel = new QLabel(this);
//    Titlelabel->setText(tr("   虚拟仪器平台"));

closeBtn = new QToolButton(this);
QPixmap closePix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);
closeBtn->setIcon(closePix);
int width = this->width();
closeBtn->setGeometry(width-25,5,1400,20);
closeBtn->setToolTip(tr("关闭"));
closeBtn->setStyleSheet("background-color:transparent;");
QHBoxLayout *hbox = new QHBoxLayout(this);
//    hbox->addWidget(Titlelabel);
//    hbox->addWidget(closeBtn);
mainToolBar->setStyleSheet("background-color:transparent;");
//hbox->addWidget(mainToolBar);
setLayout(hbox);\

addToolBar(mainToolBar);

init_sig_slots();//初始化槽函数
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_Drag = true;
m_DragPosition = event->globalPos() - this->pos();
event->accept();
}
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if (m_Drag && (event->buttons() && Qt::LeftButton)) {
move(event->globalPos() - m_DragPosition);
event->accept();
}
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
m_Drag = false;
event->accept();
}

void MainWindow::init_sig_slots()
{
QObject::connect(ui->btnCH1, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::connect(ui->btnCH2, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::connect(ui->btnCH3, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::connect(ui->btnCH4, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::connect(ui->btnCH5, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::connect(ui->btnCH6, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::connect(ui->btnCH7, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::connect(ui->btnCH8, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));

QObject::connect(pQTimerDoubleClicked,SIGNAL(timeout()),this,SLOT(timerSingleClick())); //关联定时器和槽函数
QObject::connect(closeBtn, SIGNAL(clicked()), this, SLOT(close()));  //关闭窗口和槽函数
}
void MainWindow::uninit_sig_slots()
{
QObject::disconnect(ui->btnCH1, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::disconnect(ui->btnCH2, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::disconnect(ui->btnCH3, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::disconnect(ui->btnCH4, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::disconnect(ui->btnCH5, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::disconnect(ui->btnCH6, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::disconnect(ui->btnCH7, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
QObject::disconnect(ui->btnCH8, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
for(int i=0; i<ui->tabWidget->count(); i++)
{
QObject::disconnect(changeBtn, SIGNAL(clicked(bool)),this,SLOT(on_clickCH()));
}
}

MainWindow::~MainWindow()
{
delete ui;
delete tpChart;//删除chart
tpChart = NULL;
uninit_sig_slots();
}

void MainWindow::WriteSettings()
{
//do not implement
}

void MainWindow::ReadSettings()
{
QSettings *configIniRead = new QSettings("cfgs/cfg.ini", QSettings::IniFormat);
//将读取到的ini文件保存在QString中,先取值,然后通过toString()函数转换成QString类型
configIniRead->setIniCodec(QTextCodec::codecForName("GB2312"));//设置编码格式
actionFile->setText(configIniRead->value("/ToolBarText/file").toString());
actionFile->setStatusTip(configIniRead->value("/ToolBarText/file").toString());
actionTestPro->setText(configIniRead->value("ToolBarText/testProject").toString());
actionTestPro->setStatusTip(configIniRead->value("ToolBarText/testProject").toString());
actionForceStart->setText(configIniRead->value("ToolBarText/forceStart").toString());
actionForceStart->setStatusTip(configIniRead->value("ToolBarText/forceStart").toString());
actionRealTimeData->setText(configIniRead->value("ToolBarText/realTimeData").toString());
actionRealTimeData->setStatusTip(configIniRead->value("ToolBarText/realTimeData").toString());
actionStart->setText(configIniRead->value("ToolBarText/start").toString());
actionStart->setStatusTip(configIniRead->value("ToolBarText/start").toString());
actionStartN->setText(configIniRead->value("ToolBarText/startN").toString());
actionStartN->setStatusTip(configIniRead->value("ToolBarText/startN").toString());
actionStop->setText(configIniRead->value("ToolBarText/stop").toString());
actionStop->setStatusTip(configIniRead->value("ToolBarText/stop").toString());
actionStore->setText(configIniRead->value("ToolBarText/store").toString());
actionStore->setStatusTip(configIniRead->value("ToolBarText/store").toString());
actionTestPara->setText(configIniRead->value("ToolBarText/testPara").toString());
actionTestPara->setStatusTip(configIniRead->value("ToolBarText/testPara").toString());

//读入入完成后删除指针
delete configIniRead;
}

void MainWindow::timerSingleClick()
{
isDoubleClicked = 0; //先初始化
pQTimerDoubleClicked->stop(); //先初始化
}

void MainWindow::on_clickCH()
{
QPushButton *pt = qobject_cast <QPushButton*>(sender());
if(!pt) return;
if(pt == ui->btnCH1)
{
isDoubleClicked++;
if(isDoubleClicked==1){//430ms为自己设置
pQTimerDoubleClicked->start(430);
}
if (isEnabledCH1series && (isDoubleClicked==2)){
tpChart->removeSeries(CH1series);
isEnabledCH1series = false;
QPalette pal;
pal.setColor(QPalette::ButtonText, QColor(176,176,176));
ui->btnCH1->setPalette(pal);
}
if(isDoubleClicked==2 && !isEnabledCH1series)
{
isDoubleClicked = 0; //先初始化
pQTimerDoubleClicked->stop();//先初始化
CH1series = new QLineSeries;
CH1series->append(1, 3);
CH1series->append(4, 5);
CH1series->append(5, 4.5);
CH1series->append(7, 1);
CH1series->append(11, 2);
tpChart->addSeries(CH1series);
tpChart->setAnimationOptions(QChart::AllAnimations);
tpChart->legend()->hide();
tpChart->createDefaultAxes();
isEnabledCH1series = true;
}
}
if(pt == ui->btnCH2)
{
CH2series = new QSplineSeries;
CH2series->append(0, 1);
CH2series->append(1, 2);
CH2series->append(4, 6);
CH2series->append(8, 4);
CH2series->append(11, 3.5);
CH2series->append(16, 3);
tpChart->addSeries(CH2series);
tpChart->setAnimationOptions(QChart::AllAnimations);
tpChart->legend()->hide();
tpChart->createDefaultAxes();
}
if(pt == ui->btnCH3)
{
CH3series = new QSplineSeries;
CH3series->append(0, 3);
CH3series->append(1, 4);
CH3series->append(2, 6);
CH3series->append(3, 5);
CH3series->append(8, 9);
CH3series->append(15, 10);
tpChart->addSeries(CH3series);
tpChart->setAnimationOptions(QChart::AllAnimations);
tpChart->legend()->hide();
tpChart->createDefaultAxes();
}
if(pt == ui->btnCH4)
{
CH4series = new QSplineSeries;
CH4series->append(0, 6.5);
CH4series->append(5, 3);
CH4series->append(8, 7);
CH4series->append(7, 8);
CH4series->append(13, 9);
CH4series->append(14, 11);
tpChart->addSeries(CH4series);
tpChart->setAnimationOptions(QChart::AllAnimations);
tpChart->legend()->hide();
tpChart->createDefaultAxes();
}
}

void MainWindow::on_changeBtn_clicked()
{
QPushButton *pt = qobject_cast <QPushButton*>(sender());
if(!pt) return;
if(pt->objectName() == "btnC0" )//第1个按钮点击触发
{
ui->tabWidget->setCurrentIndex(0);
QIcon button_icowhite("images/whiteIco.png");
pt->setMinimumSize(16,16);
pt->setMaximumSize(16,16);
pt->setIcon(button_icowhite);
pt->setIconSize(QSize(16,16));
}
if(pt->objectName() == "btnC1" )//第2个按钮点击触发
{
ui->tabWidget->setCurrentIndex(1);
QIcon button_icowhite("images/whiteIco.png");
pt->setMinimumSize(16,16);
pt->setMaximumSize(16,16);
pt->setIcon(button_icowhite);
pt->setIconSize(QSize(16,16));
}
if(pt->objectName() == "btnC2" )//第3个按钮点击触发
{
ui->tabWidget->setCurrentIndex(2);
QIcon button_icowhite("images/whiteIco.png");
pt->setMinimumSize(16,16);
pt->setMaximumSize(16,16);
pt->setIcon(button_icowhite);
pt->setIconSize(QSize(16,16));
}
}
main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>
#include <QFile>
#include <QMessageBox>
#include <tptabwidget.h>

#include <QtCharts>
using namespace QtCharts;

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("tpsystem.qm");   //加载国际化语言
a.installTranslator(&qtTranslator);
//loading skin from qss file
QFile qssFile("images/default.qss");
if(!qssFile.open(QFile::ReadOnly))
{
QMessageBox::warning(NULL,"error","skin loading error!");
return 0;
}
QString qss = qssFile.readAll();
a.setStyleSheet(qss);
qssFile.close();

MainWindow *w = new MainWindow;
//    QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
//    QSplashScreen *splash = new QSplashScreen;
//    splash->setPixmap(QPixmap("images/loading.png"));
//    //splash->setWindowOpacity(0.9);
//    splash->show();
//    Qt::Alignment topRight = Qt::AlignHCenter | Qt::AlignBottom;
//    splash->showMessage(QObject::tr("正在启动主界面..."),topRight, Qt::black);
//    splash->showMessage(QObject::tr("正在加载数据库模块..."),topRight, Qt::black);
//    splash->showMessage(QObject::tr("正在加载..."),topRight, Qt::black);
//    QDateTime n2=QDateTime::currentDateTime();
//    QDateTime now;
//    do{
//        now=QDateTime::currentDateTime();
//    }while (n2.secsTo(now)<=5);//5为需要延时的秒数
//    splash->finish(w);

// w->setObjectName("MainWindow");
w->setFixedHeight(800);
w->setFixedWidth(1400);

//    w->setWindowOpacity(1);
w->setWindowFlags(Qt::FramelessWindowHint);
w->setAttribute(Qt::WA_StyleSheet);
w->move((QApplication::desktop()->width() - w->width())/2,(QApplication::desktop()->height() - w->height())/2);
w->show();
return a.exec();
}


QT个人学习资源网站: https://www.qijiabo.cn 欢迎大家一起学习交流!

源码下载:
http://download.csdn.net/detail/zuoyuexian/9768445
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: