原创 QML:使用Model/View框架時根據不同的數據項使用不同的delegate

Qt自帶的QML使用Model/View框架的example中,展示數據使用的delegate(似乎)都是唯一的,不能根據不同的Model數據項使用不同的Item來展示。如果有這樣一個需求:Model的數據項中有一個字段爲itemTy

原创 QML:使用ListView運行時動態載入Item

想要實現使用ListView運行時動態載入Item,需要兩個步驟: 動態生成Item 將動態生成的Item插入到ListView的model中 對於這兩個步驟,前者可以使用createComponent和Component.cre

原创 在Linux下實現一個使用鍵盤控制的虛擬鼠標

在Linux下創建一個虛擬鼠標設備還是比較簡單的,使用內核uinput模塊提供的函數即可。創建出虛擬鼠標以後,在主線程監聽鍵盤的事件,當特定的鍵(此處使用了小鍵盤的數字鍵8、2、4、6)被按下或彈起後,進行記錄。在另一個線程根據主線程

原创 cmake構建C++項目避免編譯時對第三方庫頭文件進行依賴檢查

最近有同事反應一個使用cmake構建的C++項目編譯很慢,具體表現是隨便修改一個很簡單的cpp源文件後,重新編譯生成可執行文件的時間需要用3分鐘左右。統計了一下整個增量編譯過程各階段耗時,發現時間主要消耗在了cmake生成依賴規則和m

原创 計算二分圖(bipartite graph)交叉點(crossing)的數量

對於一個二分圖,如果圖的兩個部分的頂點都按照順序分別排列在一對平行線上,如下圖,如何計算這個二分圖的邊有多少個交叉點呢?需要注意兩點:1. 在圖的頂點處連接的邊不認爲產生了交叉點,如下圖在c、d、B和D點連接的邊;2. 如果交叉點有兩

原创 gdb的watchpoint在系統調用中被修改似乎不會被觸發

今天遇到一個越界寫問題,覆蓋了棧底的金絲雀值,導致運行時報“*** stack smashing detected ***”。一開始嘗試用gdb的watchpoint定位,但就是眼睜睜的看着運行結束後金絲雀值被修改而沒有觸發watch

原创 Linux下對input設備調用ioctl時指定EVIOCGBIT選項時的緩衝區該多大

我們有時候需要獲取/dev/input目錄下的eventX設備支持哪些事件(EV_KEY、EV_REL和EV_ABS等),可以通過ioctl調用指定EVIOCGBIT(ev, len)選項來獲取,例如: ioctl(fd, EVIOC

原创 Qt的事件驅動機制與eventfd

簡介 Qt是一個事件驅動的GUI框架,那麼,這個“事件驅動”說的是什麼呢?以我的理解就是:對於UI線程,除了初始化代碼和主循環本身之外,跑在CPU上的每條指令,要麼是爲了接收事件,要麼就是某個事件觸發的,這個事件可以直接來源於用戶操作,也

原创 C++ 虛函數之一:對象內存佈局

考慮這樣三個類: Base1、Base2和Derived各有一個數據成員。Base1有兩個虛函數A()和B(),Base2有兩個虛函數C()和D(),Dervied繼承了Base1和Base2,並重新實現了A()和C(): cla

原创 C++模板的定義是否只能放在頭文件中?

C++模板的定義是否只能放在頭文件中?答案是否定的,你也可以放在.cpp源文件中。不過,你最好還是放在頭文件中,下面我會解釋爲什麼。我不瞭解編譯器的實現細節,無法從原理上進行解釋,但可以從行爲上進行探究,此處使用的編譯器爲gcc 5.4.

原创 Linux可用內存充足時進程常駐內存被淘汰的問題

引子 最近遇到這樣一個問題:生產環境的某個C++ GUI程序界面時常出現卡頓問題,經過排查與進程的大量IO有關,但是奇怪的是,即使IO已經結束,結束後操作界面時仍然會有卡頓問題。繼續排查,發現進程常駐內存的代碼段和數據段在大量IO之後變小

原创 C++中將枚舉量值映射到枚舉量名的三種方法:使用Qt、手工映射與使用Better Enums

引子 最近遇到這樣一種場景:爲了方便調試Qt程序,需要對某些Qt控件的主要事件(鼠標事件、鍵盤事件和焦點事件等)進行日誌記錄。Qt每種事件類都是QEvent類的派生類,其具體類型可使用QEvent::type()方法獲得,該方法返回一個Q

原创 C++虛函數之二:虛函數表與虛函數調用

繼續前一篇《C++ 虛函數之一:對象內存佈局》,這次來分析一下虛函數表的結構和虛函數的調用過程。 虛函數表結構 如何查看虛函數表的結構?使用gdb直接查看內存固然可以,但是不夠直觀,那麼有沒有更好的方法呢?使用gcc的-fdump-cla

原创 Qt中QComboBox下拉列表(popup)位置與樣式的控制

轉載請註明來源:http://blog.csdn.net/imred Qt中的QComboBox在不同平臺下有所差異(主要是不可編輯的QComboBox),如下樣式A和樣式B: 左邊爲樣式A爲“fusion”樣式,在ubuntu下

原创 學習Qt狀態機框架時遇到的一個bug

Qt的狀態機框架官方文檔(http://doc.qt.io/qt-5/statemachine-api.html)的第一個例子如下: QStateMachine machine; QState *s1 = new QState(); QS