QT 扁平化界面风格,自定义TabWidget控件
2017-03-02 16:01
696 查看
直接上图先看效果:
核心代码:
mainwindow.h
mainwindow.cpp
QT个人学习资源网站: https://www.qijiabo.cn 欢迎大家一起学习交流!
源码下载:
http://download.csdn.net/detail/zuoyuexian/9768445
核心代码:
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
相关文章推荐
- Qt中如何通过QStyle自定义能够跨平台的界面控件
- Qt中如果通过QStyle自定义能够跨平台的界面控件
- Qt 自定义界面,透明与用户风格 一
- DotNetBar控件,superTabControl多文档界面(MDI)的风格、多Tab的创建方法
- QT开发之TabWidget控件
- QT关于tablewidget的自定义代理,加入自定义组合控件(qlineedit+qcombobox)
- Qt tabwidget自定义样式
- QT下自定义QQ聊天窗口tab控件
- Qt中如果通过QStyle自定义能够跨平台的界面控件
- 发布首款支持Shift/Ctrl多选的国产日历控件,界面仿Twitter风格,支持中文日期类型,支持SImpleDateFormat格式,支持change等自定义事件,全中文注释和API,欢迎支持
- QT下自定义QQ聊天窗口tab控件
- QT tabWidget控件插入对话框
- 发布首款支持Shift/Ctrl多选的国产日历控件,界面仿Twitter风格,支持中文日期类型,支持SImpleDateFormat格式,支持change等自定义事件,全中文注释和API,欢迎支持
- Qt 将进度条嵌入进table widget 控件
- Qt浅谈之五十界面自定义
- Qt之自定义界面添加最小化、最大化和关闭按钮
- 在QtWidget中自定义Model
- Qt自定义界面类并提升(提升的窗口部件)
- QT简单音乐播放器(多界面来回切换、自定义界面,音乐播放)
- Android自定义控件系列 十:利用添加自定义布局来搞定触摸事件的分发,解决组合界面中特定控件响应特定方向的事件