先看一下效果圖。
功能說明:1.因爲使用了佈局管理器,故下方白色區域(tabwidget)可隨窗體大小自動充滿。
2.依次點擊五個圖標(主頁、查詢、設置、用戶、退出),可切換白色區域顯示內容(其實是切換到tabwidget不同的索引頁),每個索引頁的UI可在Form中進行可視化設計。
代碼如下:
一、KS.pro(默認配置,無須編寫),我的工程取名爲KS
#-------------------------------------------------
#
# Project created by QtCreator 2019-11-03T00:00:46
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = KS
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h \
includes.h
FORMS += \
mainwindow.ui
二、main.cpp(也是默認配置)
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
三、includes.h
#ifndef INCLUDES_H
#define INCLUDES_H
#include <QMainWindow>
#include <QDebug>
#include <QDialog>
#include <QAction>
#include <QMessageBox>
#include <QCoreApplication>
#include <QEvent>
#include <QImage>
#include <QPixmap>
#include <QStatusBar>
#include <QMouseEvent>
#include <QGridLayout>
#include <QVBoxLayout>
#endif // INCLUDES_H
四、 mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "includes.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
QAction *Action_MainForm;
QAction *Action_Inquire;
QAction *Action_Settings;
QAction *Action_Users;
QAction *Action_Quit;
void InstallEventFilter();
void UI_Init();
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
protected:
bool eventFilter(QObject *obj, QEvent *event);
public slots:
};
#endif // MAINWINDOW_H
五、mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
UI_Init();
InstallEventFilter();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::UI_Init()
{
this->resize(1100,700);
this->setWindowTitle("監控軟件");
setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowMinMaxButtonsHint);
QVBoxLayout* layout = new QVBoxLayout(); //創建一個layout對象
ui->tabWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); //設置tabWidget的尺寸策略
ui->tabWidget->findChildren<QTabBar*>().at(0)->hide(); //隱藏tabwidget表頭
layout->addWidget(ui->tabWidget); //將tabwidget添加到佈局layout
QWidget* widget = new QWidget(this); //新建一個widget
widget->setLayout(layout); //將layout添加到widget區域中
this->setCentralWidget(widget);//將widget設置爲中心窗口
int maintoolbar_size=54;
ui->mainToolBar->setFixedHeight(maintoolbar_size);
ui->mainToolBar->setIconSize(QSize(maintoolbar_size,maintoolbar_size));
QPixmap *pixmap_logo_long=new QPixmap("./resources/logo_long.jpg");
QPixmap p_logo_long=pixmap_logo_long->scaled(270,50,Qt::KeepAspectRatio);
QPixmap *pixmap_home=new QPixmap("./resources/home.jpg");
QPixmap p_home=pixmap_home->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);
QPixmap *pixmap_inquire=new QPixmap("./resources/inquire.jpg");
QPixmap p_inquire=pixmap_inquire->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);
QPixmap *pixmap_settings=new QPixmap("./resources/settings.jpg");
QPixmap p_settings=pixmap_settings->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);
QPixmap *pixmap_human=new QPixmap("./resources/human.jpg");
QPixmap p_human=pixmap_human->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);
QPixmap *pixmap_quit=new QPixmap("./resources/quit.jpg");
QPixmap p_quit=pixmap_quit->scaled(maintoolbar_size,maintoolbar_size,Qt::KeepAspectRatio);
//創建Action
QWidget* blankwidget; int spacesize=30;
QWidget* logowidget = new QWidget(this); logowidget->setFixedSize(270,50);
QLabel* label_longlogo=new QLabel(logowidget);label_longlogo->setFixedSize(270,50);
label_longlogo->setPixmap(p_logo_long);
ui->mainToolBar->addWidget(logowidget);
QWidget* spacer = new QWidget();
spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
ui->mainToolBar->addWidget(spacer);
Action_MainForm = new QAction(QIcon(p_home), tr("&主界面"), this);
Action_MainForm->setShortcut(tr("Ctrl+1"));
Action_MainForm->setStatusTip(tr("Main interface"));
ui->mainToolBar->addAction(Action_MainForm);
blankwidget = new QWidget(this); //新建一個widget
blankwidget->setFixedSize(spacesize,maintoolbar_size);
ui->mainToolBar->addWidget(blankwidget);
Action_Inquire = new QAction(QIcon(p_inquire), tr("&查詢"), this);
Action_Inquire->setShortcut(tr("Ctrl+2"));
Action_Inquire->setStatusTip(tr("Inquire"));
ui->mainToolBar->addAction(Action_Inquire);
blankwidget = new QWidget(this); //新建一個widget
blankwidget->setFixedSize(spacesize,maintoolbar_size);
ui->mainToolBar->addWidget(blankwidget);
Action_Settings = new QAction(QIcon(p_settings), tr("&設置"), this);
Action_Settings->setShortcut(tr("Ctrl+3"));
Action_Settings->setStatusTip(tr("Settings"));
ui->mainToolBar->addAction(Action_Settings);
blankwidget = new QWidget(this); //新建一個widget
blankwidget->setFixedSize(spacesize,maintoolbar_size);
ui->mainToolBar->addWidget(blankwidget);
Action_Users = new QAction(QIcon(p_human), tr("&用戶"), this);
Action_Users ->setShortcut(tr("Ctrl+4"));
Action_Users ->setStatusTip(tr("User Management"));
ui->mainToolBar->addAction(Action_Users);
blankwidget = new QWidget(this); //新建一個widget
blankwidget->setFixedSize(spacesize,maintoolbar_size);
ui->mainToolBar->addWidget(blankwidget);
Action_Quit = new QAction(QIcon(p_quit), tr("&退出"), this);
Action_Quit->setShortcut(tr("Ctrl+5"));
Action_Quit->setStatusTip(tr("Quit"));
ui->mainToolBar->addAction(Action_Quit);
blankwidget = new QWidget(this); //新建一個widget
blankwidget->setFixedSize(spacesize,maintoolbar_size);
ui->mainToolBar->addWidget(blankwidget);
for(int i=0;i<ui->tabWidget->tabBar()->count();i++)
{
ui->tabWidget->setTabEnabled(i,false);
}
ui->tabWidget->setTabEnabled(0,true);
ui->tabWidget->setCurrentIndex(0);
}
//註冊事件過濾器
void MainWindow::InstallEventFilter()
{
Action_MainForm->setCheckable(true);
Action_Inquire->setCheckable(true);
Action_Settings->setCheckable(true);
Action_Users->setCheckable(true);
Action_Quit->setCheckable(true);
Action_MainForm->installEventFilter(this);
Action_Inquire->installEventFilter(this);
Action_Settings->installEventFilter(this);
Action_Users->installEventFilter(this);
Action_Quit->installEventFilter(this);
}
//事件過濾器
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if(event->type()==QEvent::ActionChanged)
{
if(obj==Action_MainForm&&Action_MainForm->isChecked()==true)
{
qDebug()<<"1 Action_MainForm";
if(Action_Inquire->isChecked())Action_Inquire->setChecked(false);
if(Action_Settings->isChecked())Action_Settings->setChecked(false);
if(Action_Users->isChecked())Action_Users->setChecked(false);
if(Action_Quit->isChecked())Action_Quit->setChecked(false);
ui->tabWidget->setCurrentIndex(0);
}
else if(obj==Action_Inquire&&Action_Inquire->isChecked()==true)
{
qDebug()<<"2 Action_Inquire";
if(Action_MainForm->isChecked())Action_MainForm->setChecked(false);
if(Action_Settings->isChecked())Action_Settings->setChecked(false);
if(Action_Users->isChecked())Action_Users->setChecked(false);
if(Action_Quit->isChecked())Action_Quit->setChecked(false);
ui->tabWidget->setCurrentIndex(1);
}
else if(obj==Action_Settings&&Action_Settings->isChecked()==true)
{
qDebug()<<"3 Action_Settings";
if(Action_MainForm->isChecked())Action_MainForm->setChecked(false);
if(Action_Inquire->isChecked())Action_Inquire->setChecked(false);
if(Action_Users->isChecked())Action_Users->setChecked(false);
if(Action_Quit->isChecked())Action_Quit->setChecked(false);
ui->tabWidget->setCurrentIndex(2);
}
else if(obj==Action_Users&&Action_Users->isChecked()==true)
{
qDebug()<<"4 Action_Users";
if(Action_MainForm->isChecked())Action_MainForm->setChecked(false);
if(Action_Inquire->isChecked())Action_Inquire->setChecked(false);
if(Action_Settings->isChecked())Action_Settings->setChecked(false);
if(Action_Quit->isChecked())Action_Quit->setChecked(false);
ui->tabWidget->setCurrentIndex(3);
}
else if(obj==Action_Quit&&Action_Quit->isChecked()==true)
{
qDebug()<<"5 Action_Quit";
if(Action_MainForm->isChecked())Action_MainForm->setChecked(false);
if(Action_Inquire->isChecked())Action_Inquire->setChecked(false);
if(Action_Settings->isChecked())Action_Settings->setChecked(false);
if(Action_Users->isChecked())Action_Users->setChecked(false);
ui->tabWidget->setCurrentIndex(4);
}
else
{
;
}
//如果想讓五個圖標點擊後不自動彈起,請註釋掉接下來的五行代碼
Action_MainForm->setChecked(false);
Action_Inquire->setChecked(false);
Action_Settings->setChecked(false);
Action_Users->setChecked(false);
Action_Quit->setChecked(false);
}
//eventFilter實現的最後必須調用watcher基類的eventFilter函數以傳遞事件,否則obj的所有事件都將丟失
return QObject::eventFilter(obj,event);
}
後記:
1.使用事件過濾器無法判別QAction的按下或擡起,所以造成代碼量有些複雜。如果改用信號槽機制,將每個Action的triggered信號連接到相應的槽進行處理,也是一種思路,代碼量也相差無幾。
2.本次示例沒有建立菜單欄中的菜單項,也沒有將Action添加到菜單中,因爲對於簡單的項目,會顯得有些冗餘,讀者也可自己編寫,將這五個Action添加到菜單中。
期待一起進步,也祝我接下來幾天玩的愉快哈哈~