1. 程式人生 > >Qt -QFlags的解讀與使用

Qt -QFlags的解讀與使用

1、列舉

在向函式傳遞值表示我們要使用的型別時,我們可以用好多方法去定義,比如:view的顯示或隱藏,我們可以用true表示顯示,false表示隱藏;一個view的位置,上下左右,我們可以分別用int,1、2、3、4來表示,也可以用列舉

enum{
Up =1,
Down=2,
Left=3,
Right= 4}

以View的位置為例,我們需要擴充套件它,比如左上,左下….
一般做法是


enum{
Up =1,
Down=2,
Left=4,
Right= 8,
UpLeft = Up|Left,
DownLeft = Down|Left,
UpRight = Up|Right,
DownRight = Up|Right
}

2、QFlags

2.1 實現

在Qt中,提供了一種更簡潔的方法—-QFlags,實現方法如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QFlags>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    enum Position {
        Up = 1,
        Down = 2,
        Left
= 4 , Right = 8 }; Q_DECLARE_FLAGS(Positions, Position) explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QString sreplace(QString reg, QString str, QStringList strs); void print(MainWindow::Positions ax); }; Q_DECLARE_OPERATORS_FOR_FLAGS
(MainWindow::Positions) #endif // MAINWINDOW_H

第一步:引入標頭檔案#include< QFlags >,有些標頭檔案中已引用,不需要再引用
第二步:定義列舉
第三部:使用巨集Q_DECLARE_FLAGS(Positions, Position)
第四步:使用巨集Q_DECLARE_OPERATORS_FOR_FLAGS(MainWindow::Positions)

2.2使用

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    print(Up);
    print(Down);
    print(Left);
    print(Right);
    print(Up|Left);
    print(Down|Left);
    print(Up|Right);
    print(Down|Right);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::print(Positions ax){
    qDebug()<<ax;
}

2.3結果

QFlags(0x1)
QFlags(0x2)
QFlags(0x4)
QFlags(0x8)
QFlags(0x1|0x4)
QFlags(0x2|0x4)
QFlags(0x1|0x8)
QFlags(0x2|0x8)

3、優點

對於只有兩個值的true和false完全可以勝任;但是,若值多的話,用int顯然是不行的,因為在定義方法的時候,用int是不安全的,根本無法確定傳進來的值是合法的,只能做一大堆的判斷,程式碼變得亂糟糟的。用列舉時,如第一節,我們有四種基礎定義,然後我們需要新的組合時,需要重新定義型別,第一節定義了四種新的型別,但若列舉值比較多的話組合可能就是指數倍增長,這種情況下,用int定義,並且|操作的方式,是節省時間的,但無法使值合法。
QFlags的實現簡化了我們的定義,並且使值合法化。
以第二節為例,在我們定義完成後,我們要判斷是否是左上,我們可以這樣做:

if(ax.testFlag(Up)&&ax.testFlag(Left)){
        //do something
}

傳值為左上,我們可以這樣做:

print(Up|Left);

很方便有木有。。。
凡人之道,心欲小,志欲大;智欲圓,行欲方。