zqt_helper 輕鬆開發Qt5 Widgets應用
- 2020 年 5 月 23 日
- 筆記
- C++, C++linux, gui, wxWidgets, c++11, Qt
目標:
1. 程式碼更加緊湊,所寫即所到。
2. 程式碼層次更直觀,直接反映介面窗口層次關係。
3. 不繼承類,不重寫虛函數,slot接收QEvent。
4. 簡單寫布局,忘掉api函數。
5. 免去一大堆臨時變數的變數名。
思路:
operator () (QLayout*) 開始一個布局
operator () (QWidget*) 開始一個窗口元素,並將元素加入到布局
operator [] <T> (const T&) 設置布局或窗口元素的屬性
operator [] (lambda) 設置一個元素的事件回調
zqt_helper項目地址//github.com/bbqz007/zhelper-qt5Widgets, 適用於Qt5 Widgets。
zwx_helper項目地址//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項目地址//github.com/bbqz007/zhelper-qt5Widgets, 適用於Qt5 Widgets。
zwx_helper項目地址//github.com/bbqz007/zhelper-wxWidgets , 適用於 wxWidgets。
兩個項目同樣提供一個gui4smali的demo。

