基於QAction和事件過濾器的軟件主界面設計

先看一下效果圖。
功能說明: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添加到菜單中。
期待一起進步,也祝我接下來幾天玩的愉快哈哈~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章