如果是不使用native特性的話,其實非常簡單,一個Qt::FrameLessWindow就搞定了,頂多用QLabel、QHBoxLayout、QToolButton等模擬下標題欄,然後過載下滑鼠事件來處理標題欄拖動和邊框拖動。
但如果要加入native特性的話,就需要呼叫平臺window manager的API。
windows和macOS上,native視窗管理都是固定的實現方案,有固定的API可以套用。
然而linux上……視覺化介面由桌面管理器負責,桌面管理器下面還有視窗管理器,兩者都是隻是個使用者程序,不歸linux核心管理,都是社群自由實現的。
桌面管理器有N家,視窗管理器有M家,它們之間能夠形成的組合,雖然沒有M*N那麼誇張,但也是差不多數量級的。
所以,你需要一家一家適配過去,每一家的實現方案都不同……
每個桌面管理器都有自己的一套ui框架,那麼和Qt之間的適配就是問題……有比如GNOME是用GTK實現的,而KDE是方案是用Qt寫的……
你適配了桌面管理器的UI框架還不夠,下面的視窗管理器,每一個相當於都是一個完全不同的系統介面風格,你就算做到吐血又能實現多少……
具體有多少種常見的視窗管理器實現方案呢……可以試試裝一個叫“screenfetch”的軟體包,然後man一下看看……
就算不強求全部都實現,就實現幾個大眾發行版自帶的幾種可選的桌面管理器,起碼也有個七八九十種組合,我敬你是個壯士……
所以,Qt在linux上,要麼就用沒有native特性的自定義無邊框視窗,要麼就老老實實用QMainWindow/QDialog自帶的系統主題風格,不要想不開自己造輪子,真的。
如果是不使用native特性的話,其實非常簡單,一個Qt::FrameLessWindow就搞定了,頂多用QLabel、QHBoxLayout、QToolButton等模擬下標題欄,然後過載下滑鼠事件來處理標題欄拖動和邊框拖動。
但如果要加入native特性的話,就需要呼叫平臺window manager的API。
windows和macOS上,native視窗管理都是固定的實現方案,有固定的API可以套用。
然而linux上……視覺化介面由桌面管理器負責,桌面管理器下面還有視窗管理器,兩者都是隻是個使用者程序,不歸linux核心管理,都是社群自由實現的。
桌面管理器有N家,視窗管理器有M家,它們之間能夠形成的組合,雖然沒有M*N那麼誇張,但也是差不多數量級的。
所以,你需要一家一家適配過去,每一家的實現方案都不同……
每個桌面管理器都有自己的一套ui框架,那麼和Qt之間的適配就是問題……有比如GNOME是用GTK實現的,而KDE是方案是用Qt寫的……
你適配了桌面管理器的UI框架還不夠,下面的視窗管理器,每一個相當於都是一個完全不同的系統介面風格,你就算做到吐血又能實現多少……
具體有多少種常見的視窗管理器實現方案呢……可以試試裝一個叫“screenfetch”的軟體包,然後man一下看看……
就算不強求全部都實現,就實現幾個大眾發行版自帶的幾種可選的桌面管理器,起碼也有個七八九十種組合,我敬你是個壯士……
所以,Qt在linux上,要麼就用沒有native特性的自定義無邊框視窗,要麼就老老實實用QMainWindow/QDialog自帶的系統主題風格,不要想不開自己造輪子,真的。