在 Qt Designer 內使用自定義的 widget Part2

這篇是之前《在 Qt Designer 內使用自定義的 widget》一文的後續。

其實本來 Heresy 一直以為之前使用 QDesignerCustomWidgetInterface 另外封包一個 plugin 物件出來後就搞定了,但是後來才發現,真正要拿來建立函式庫,還是有點問題。

原因就是:如果在一個專案裡面、按照之前的方法寫多個 plugin 出來的話,在建置的連結階段,會出現重複定義的問題。Visual Studio 得到的錯誤會向下面這樣:

錯誤    LNK2005    qt_plugin_instance 已在 moc_plugin2.obj 中定義過了
QtUIforDesigner    moc_Plugin1.obj    1
錯誤    LNK2005    qt_plugin_query_metadata 已在 moc_Plugin2.obj 中定義過了
QtUIforDesigner    moc_Plugin1.obj    1

閱讀更多»

在 Qt Designer 內使用自定義的 widget

Qt 基本上是一個很有彈性的跨平台圖形介面框架,他本身就提供了很多 widget 可以使用。而除了可以透過程式碼來設計界面外,也可以使用官方提供的 Qt Designer(Qt 設計師、官網),用所見即所得的方法來拉出自己的介面,算是相當地方便。

如果官方提供的 widget 不夠用的話,也可以自己組合既有的元件、或是重頭撰寫一個符合自己的元件來用;這部分有需要話,可以參考官方的《Analog Clock Example》。

而如果想在 Designer 裡面使用自己定義的 widget 的話,就稍微麻煩一點了。這篇就是稍微整理一下,要怎麼在 Qt Designer 裡面、使用自己定義的 widget。

閱讀更多»

C++AMP 已死

C++ AMP 是微軟在 2011 年發表、在 2012 年推出的一套適用於 GPGPU、大量平行化的 C++ 函式庫。他基本上算是相對高階的 GPGPU 開發方案,由於底層是使用 DirectX 來做的,所以理論上能支援不同廠牌的顯示卡(參考《C++ AMP 相關資料》)。

不過,由於 Heresy 這邊還是有考慮到要跨到 Linux 環境的問題,所以簡單玩了一下後,就沒有去認真研究這個東西了。(不過由於 C++AMP 屬於開放標準,倒也真有人在 CLANG/LLVM + OpenCL 弄出了 C++AMP 的實作;參考《Bringing C++AMP Beyond Windows via CLANG and LLVM》)

而前幾天,忽然和到 Google 推薦的文章《C++ AMPの死について》,這才發現原來 C++AMP 也已經被微軟賜死了…

閱讀更多»

C++ 程式執行的順序

不知道一般人覺得下面這段 C++ 程式碼,執行會是什麼結果?

int i = 0;
std::cout << ++i << "/" << ++i << "/" << ++i << std::endl;

很直覺地,感覺應該會是「1/2/3」吧?

但是實際上,如果使用 g++ 6 以前的版本、或是 Visual Studio 2019 的話,應該會很訝異地發現,結果是「3/3/3」!

閱讀更多»

C++ 17/20 的一些數值函式庫

這篇是延續之前的《C++11 的一些數值函式庫》,繼續來整理 C++17C++20 在數值函式庫上的變化。

首先,在 <numeric> 這個 header 裡面(參考),又加入了很多 template 函式可以使用,其中也包含了 gcd(對大公因數)、lcm(最小公倍數)、inner_product(內積)等等;雖然不能說沒用,但是老實說,有需要的人大概都已經有自己的方案了吧…

另外,這次也還有支援平行化reduce(),以及在平行化演算法裡面很常見的 inclusive_scan()exclusive_scan() 可以使用。

閱讀更多»

C++11 的一些數值函式庫

這篇算是簡單來記錄一下 C++11 一些新增的數值函式庫的內容;C++17 和 C++20 的應該之後也會整理一下。

一般性數學函式

實際上,C++ 之前在 <cmath> 裡面,就有提供包括 std:abs()std::log()、三角函數在內、不少基礎的數學函式庫了。而在 C++11 推出後,這部分也做了一定程度的擴展;除了支援型別的增加(這邊大多不是用 template 來實作)外,也多了包括 gamma、error function 等在內相當多的函式。

而像是要把浮點數取整數值,除了傳統的 ciel()floor() 外,現在也提供了 trunc()round() 可以使用。

另外,現在也可以使用 nearbyint()rint() 這兩個系統的函式,來使用系統當下的捨入模式(rounding mode)來做數值的處理;而這個模式,則可以透過 fesetround() 來設定、切換(參考)。

閱讀更多»

C++ 20 Ranges

目前 C++ 最新的正式標準、C++ 20 在去年年初就已經正式定案了,當時 Heresy 也有稍微記錄過;其中,也有針對 conceptstemplate lambda 稍微紀錄了一下自己玩的想法。

這篇呢,則是來看一下 C++ 20 的 Ranges 這個新的函式庫吧~

C++20 的 ranges 這個函式庫(CppReference),基本上是針對一組範圍的資料來做處理的函示庫,重點是提供了本身不擁有資料的「view」、以及用來快速串聯操作的「view adapter」的架構。

由於 view 本身基本上都是採用使用 iterator 來做存取的概念,所以在個人來看,應該可以算是 C++ containter(vector 這些)的一個延伸。

閱讀更多»

C++20 的 template lambda

C++11 所推出的 Lambda expression 這種匿名函式,Heresy 一開始還覺得不知道哪裡可以用?但是後來真正寫多了,才發現他實際上是非常好用的一個功能。

而在 C++14 / C++17,也又針對 lambda 加入了一些新的功能、讓他更為強大。
不管是 captures with an initialiser 還是 generic lambda,都讓 lambda 的使用上更為方便。

到了 C++20,則是又加入了「template parameter for lambda」這項特性,算是又做了一些強化。

閱讀更多»