zqt_helper 輕鬆開發Qt5 Widgets應用

bbqz007發表於2020-05-23

目標:

1. 程式碼更加緊湊,所寫即所到。

2. 程式碼層次更直觀,直接反映介面視窗層次關係。

3. 不繼承類,不重寫虛擬函式,slot接收QEvent。

4. 簡單寫佈局,忘掉api函式。

5. 免去一大堆臨時變數的變數名。

思路:

operator () (QLayout*) 開始一個佈局

operator () (QWidget*) 開始一個視窗元素,並將元素加入到佈局

operator [] <T> (const T&) 設定佈局或視窗元素的屬性

operator [] (lambda) 設定一個元素的事件回撥

zqt_helper專案地址https://github.com/bbqz007/zhelper-qt5Widgets, 適用於Qt5 Widgets。

zwx_helper專案地址https://github.com/bbqz007/zhelper-wxWidgets , 適用於 wxWidgets。

使用zqt_helper如何寫Qt Widgets 佈局:

layout::begin                            // 最外層垂直佈局
    (new QVBoxLayout)
        [ QMargins() ]
        (layout::begin                    // 第一個水平佈局
              (new QHBoxLayout)
                    (new QLineEdit)
                        ["input txt 1"]    // id
                        [ QSize() ]    // 設定大小
                    (new QPushButton)
                        ["input btn 1"]    // id
                        [ QSize() ]
                        [ ONSIGNAL(    // 設定slot,同時定義slot
                             &QPushButton::clicked,
                               [=] (bool) {
                                    // handle slot
                                })]
                (layout::end))
    
          (layout::begin                   //  第二個水平佈局 
                (new QHBoxLayout)
                (new QListWidget)
                    ["list"] // id
                    [ QSize() ]
                 (layout::end))
    (layout::end,
        [=](QLayout*){
            // 完成佈局後回撥
    })  ;                               

基本上可以不呼叫具體QLayout和QWidget的函式,也免去了記住這些函式。沒有宣告過一個變數名。

如果希望更加細緻的設定可以在 operator[ ] 設定ONLOAD回撥:

(new QTableWidget)
    ["table 1"]    // id
    [ ONLOAD [=](QTableWidget* table) {
           // 設定table
            
     }]

Qt雖然有signal-slot機制,支援動態回撥繫結,但是對於一些事件(QEvent 如輸入裝置,視窗管理等事件),你必須繼承QWidget,重寫對應的事件虛擬函式。這裡提供一個ZQ模板類,將QWidget所有事件虛擬函式由ZQEmitter代理signal發射,也就是你可以通過slot接收這些事件,而不必去多寫一個繼承類。尤其是為了彈出選單就要多寫一個繼承類。

用slot接收QEvent:

(new ZQ<QFrame>)
    ["frame 1"]     // id
    [ ONSIGNAL(
            &QFrame::contextMenuEvent,
            [=] (QContextMenuEvent*) {
                // 彈出選單
     })]            

zqt_helper 同樣支援 menu佈局,如果你沒有搞明QMenu和QAction,沒有關係,你可以忘記。

menu::begin
    (new QMenu)
         ("level 1 item 1")
                   [ TRIGGERED [=]() {
                        // do sth
                    } ]            
         ("level 1 item 2")
                   [ TRIGGERED [=]() {
                        // do sth
                    } ]
         (menu::begin
                ("level 1 item 3")
                    ("level 2 item 1")
                    ("level 2 item 2")
                       [ TRIGGERED [=]() {
                            // do sth
                        } ]    
                (menu::end))
    (menu::end);    

zqt_helper支援QTableWidget

QTableWidget* table = new QTableWidget;
// 設定水平header
column::begin(table)
    ("header col 1")
        [ QFont() ]
        [ QColor() ]
    ("header col 2")
    ("header col 3")
    ("header col 4")
    (column::end);
// 新增行內容
row::begin(table)
    ("row1 col1")
    ("row1 col2")
    ("row1 col3")
    ("row1 col4")
    (row::another)
    ("row2 col1")
    ("row2 col2")
    ("row2 col3")
    ("row2 col4")
    (row::end);
// 修改單元
cell::begin(table)
    (1, 2)    // 定位
        [ "change@ row2 col3" ]
    (0, 3)
        [ "change@ row1 col4" ]
    (cell::end);

zqt_helper專案是zwx_helper專案的qt5版本,支援同樣的程式設計方法。

zqt_helper專案地址https://github.com/bbqz007/zhelper-qt5Widgets, 適用於Qt5 Widgets。

zwx_helper專案地址https://github.com/bbqz007/zhelper-wxWidgets , 適用於 wxWidgets。

兩個專案同樣提供一個gui4smali的demo。

相關文章