Kerangka Kustomisasi Jendela Cross-Platform untuk Widget QT dan QT Quick.
Proyek ini mewarisi sebagian besar implementasi Wangwenx190 FramelessHelper, dengan refactoring dan peningkatan arsitektur yang lengkap.
Permintaan fitur dipersilakan.
Anda dapat membagikan temuan, pemikiran, dan ide Anda tentang meningkatkan / mengimplementasikan fungsionalitas QWindowKit pada lebih banyak platform dan aplikasi!


| MacOS | Linux (Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami adalah perangkat lunak komunikasi gratis/libre, end-to-end yang dienkripsi, dan pribadi.
Tietie adalah perangkat lunak manajemen clipboard yang sederhana dan mudah digunakan. Dukungan multi-format, kemampuan pencarian yang kuat.
| Komponen | Persyaratan | Detail |
|---|---|---|
| Qt | > = 5.12 | Inti, gui, widget, cepat |
| Penyusun | > = C ++ 17 | MSVC 2019, GCC, dentang |
| Cmake | > = 3.19 | > = 3.20 disarankan |
Harap baca kerentanan dengan cermat untuk memperoleh persyaratan terperinci.
git clone --recursive https://github.com/stdware/qwindowkit
cd qwindowkit
cmake -B build -S .
-Dqmsetup_DIR= < dir > # Optional
-DQWINDOWKIT_BUILD_QUICK=TRUE # Optional
-DCMAKE_INSTALL_PREFIX=/path/install
-G " Ninja Multi-Config "
cmake --build build --target install --config Debug
cmake --build build --target install --config Release Baca root CMakeLists.txt untuk lebih banyak opsi build.
Anda juga dapat menyertakan direktori ini sebagai subproyasi jika Anda memilih CMake sebagai sistem build Anda.
Untuk sistem build lainnya, Anda perlu menginstal dengan CMake terlebih dahulu dan menyertakan file konfigurasi yang sesuai dalam proyek Anda.
cmake -B build -DQWindowKit_DIR=/path/install/lib/cmake/QWindowKit find_package (QWindowKit COMPONENTS Core Widgets Quick REQUIRED)
target_link_libraries (widgets_app PUBLIC QWindowKit::Widgets)
target_link_libraries (quick_app PUBLIC QWindowKit::Quick) # WidgetsApp.pro
include ( "/path/install/share/QWindowKit/qmake/QWKWidgets.pri" )
# QuickApp.pro
include ( "/path/install/share/QWindowKit/qmake/QWKQuick.pri" )Lihat Panduan Visual Studio untuk penggunaan terperinci.
Inisialisasi berikut harus dilakukan sebelum konstruksi widget.
# include < QtWidgets/QApplication >
int main ( int argc, char *argv[])
{
QGuiApplication::setAttribute (Qt::AA_DontCreateNativeWidgetSiblings)
// ...
} Pertama, Setup WidgetWindowAgent untuk instance QWidget teratas Anda. (Setiap jendela membutuhkan agennya sendiri.)
# include < QWKWidgets/widgetwindowagent.h >
MyWidget::MyWidget (QWidget *parent) {
// ...
auto agent = new QWK::WidgetWindowAgent ( this );
agent-> setup ( this );
// ...
}Jika Anda tidak ingin mendapatkan kelas widget baru atau mengubah konstruktor, Anda dapat menginisialisasi agen setelah jendela konstruksi.
auto w = new MyWidget();
auto agent = new QWK::WidgetWindowAgent(w);
agent-> setup (w); Anda harus menghubungi QWK::WidgetWindowAgent::setup() sedini mungkin, terutama ketika Anda perlu mengatur batasan ukuran. QWindowKit akan mengubah beberapa data internal QT yang akan memengaruhi bagaimana QT menghitung ukuran jendela, dan dengan demikian Anda perlu membiarkan QWindowKit menginisialisasi pada awalnya.
Kemudian, buat widget bar judul Anda, yang tanpanya jendela tidak memiliki fitur interaksi dasar, dan lebih baik memasukkannya ke tata letak jendela.
Anda dapat menggunakan WindowBar yang disediakan oleh WidgetFrame dalam contoh sebagai wadah komponen bilah judul Anda.
Biarkan WidgetWindowAgent tahu widget mana bilah judulnya.
agent-> setTitleBar (myTitleBar); Selanjutnya, atur petunjuk tombol sistem untuk memberi tahu WidgetWindowAgent tentang peran widget anak, yang penting bagi tata letak snap agar berfungsi.
agent-> setSystemButton (QWK::WindowAgentBase::WindowIcon, myTitleBar-> iconButton ());
agent-> setSystemButton (QWK::WindowAgentBase::Minimize, myTitleBar-> minButton ());
agent-> setSystemButton (QWK::WindowAgentBase::Maximize, myTitleBar-> maxButton ());
agent-> setSystemButton (QWK::WindowAgentBase::Close, myTitleBar-> closeButton ());Melakukan hal ini tidak berarti bahwa peristiwa klik tombol -tombol ini secara otomatis dikaitkan dengan tindakan jendela, Anda masih perlu menghubungkan sinyal dan slot secara manual untuk meniru perilaku jendela asli.
Pada macOS, langkah ini dapat dilewati karena lebih baik menggunakan tombol yang disediakan oleh sistem.
Last but not least, atur Hit-Test Petunjuk Terlihat Untuk Membiarkan WidgetWindowAgent Widget mana yang bersedia menerima acara mouse.
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);Wilayah istirahat dalam bilah judul akan dianggap sebagai area yang dapat diseret bagi pengguna untuk memindahkan jendela, dan dengan demikian setiap qwidget di dalamnya tidak akan menerima acara interaksi pengguna seperti acara mouse/acara fokus/dll lagi, tetapi Anda masih dapat mengirim/memposting acara tersebut ke widget ini secara manual, baik melalui QT API atau API sistem.
Qt::WindowMaximizeButtonHint dari jendela. Pastikan Anda telah mendaftarkan QWindowKit ke Qtquick:
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
} Maka Anda dapat menggunakan tipe dan kelas data QWindowKit dengan mengimpor URI:
import QtQuick 2.15
import QtQuick.Window 2.15
import QWindowKit 1.0
Window {
id : window
visible : false // We hide it first, so we can move the window to our desired position silently.
Component . onCompleted : {
windowAgent . setup ( window )
window . visible = true
}
WindowAgent {
id : windowAgent
// ...
}
}Anda dapat menghilangkan nomor versi atau menggunakan "Auto" bukan "1.0" untuk modul URI jika Anda menggunakan QT6.
Seperti yang baru saja kami sebutkan di atas, jika Anda akan mengatur batasan ukuran, silakan lakukan setelah windowAgent.setup() dipanggil.
Lihat contoh untuk lebih banyak kasus penggunaan demo. Contohnya tidak memiliki dukungan DPI tinggi.
Qt::WA_NativeWindow Properti diaktifkan sebagai keturunan dari jendela tanpa bingkai, Anda harus mengaktifkan Qt::WA_DontCreateNativeAncestors sebelumnya. GetWindowRect atau GetClientRect . Akar penyebabnya terletak jauh di dalam implementasi QT QPA dan saat ini kami tidak tahu cara memperbaikinya tanpa memodifikasi QT itu sendiri. QWindowKit dilisensikan di bawah lisensi Apache 2.0.