إطار تخصيص النوافذ عبر المنصات للأغذية QT و QT Quick.
ورث هذا المشروع معظم تنفيذ Wangwenx190 FramelessHelper ، مع إعادة إنشاء وترقية كاملة للهندسة المعمارية.
طلبات الميزة موضع ترحيب.
يمكنك مشاركة النتائج التي توصلت إليها وأفكارك وأفكارك حول تحسين / تنفيذ وظائف Qwindowkit على المزيد من المنصات والتطبيقات!


| ماكوس | Linux (Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami هو برامج اتصالات مجانية/libre ، مشفرة من طرف إلى طرف.
Tietie هو برنامج إدارة الحافظة بسيط وسهل الاستخدام. دعم متعدد التنسيق ، قدرة البحث القوية.
| عنصر | متطلبات | تفاصيل |
|---|---|---|
| كيو تي | > = 5.12 | جوهر ، واجهة المستخدم الرسومية ، السلاحف ، سريعة |
| المترجم | > = C ++ 17 | MSVC 2019 ، GCC ، Clang |
| cmake | > = 3.19 | > = 3.20 يوصى به |
يرجى قراءة نقاط الضعف بعناية للحصول على متطلبات مفصلة.
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 اقرأ الجذر CMakeLists.txt لمزيد من خيارات البناء.
يمكنك أيضًا تضمين هذا الدليل كحجم فرعي إذا اخترت CMake كنظام الإنشاء الخاص بك.
بالنسبة لأنظمة الإنشاء الأخرى ، تحتاج إلى التثبيت باستخدام CMake أولاً وتضمين ملفات التكوين المقابلة في مشروعك.
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" )انظر Visual Studio Guide للحصول على استخدامات مفصلة.
يجب أن يتم التهيئة التالية قبل أي بنيات عنصر واجهة مستخدم.
# include < QtWidgets/QApplication >
int main ( int argc, char *argv[])
{
QGuiApplication::setAttribute (Qt::AA_DontCreateNativeWidgetSiblings)
// ...
} أولاً ، الإعداد WidgetWindowAgent لمثيل QWidget الأعلى. (كل نافذة تحتاج إلى وكيلها الخاص.)
# include < QWKWidgets/widgetwindowagent.h >
MyWidget::MyWidget (QWidget *parent) {
// ...
auto agent = new QWK::WidgetWindowAgent ( this );
agent-> setup ( this );
// ...
}إذا كنت لا ترغب في استخلاص فئة عنصر واجهة مستخدم جديدة أو تغيير المُنشئ ، فيمكنك تهيئة الوكيل بعد بناء النافذة.
auto w = new MyWidget();
auto agent = new QWK::WidgetWindowAgent(w);
agent-> setup (w); يجب عليك الاتصال بـ QWK::WidgetWindowAgent::setup() في أقرب وقت ممكن ، خاصةً عندما تحتاج إلى ضبط الحجم. ستغير Qwindowkit بعض البيانات الداخلية QT التي ستؤثر على كيفية حساب QT حجم النافذة ، وبالتالي تحتاج إلى السماح Qwindowkit بالتهيئة في البداية.
بعد ذلك ، قم ببناء أداة شريط العنوان الخاصة بك ، والتي بدونها تفتقر النافذة إلى ميزة التفاعل الأساسية ، ومن الأفضل وضعها في تصميم النافذة.
يمكنك استخدام WindowBar الذي توفره WidgetFrame في الأمثلة كحاوية لمكونات شريط العنوان.
دع WidgetWindowAgent تعرف أي عنصر عنصر العنوان هو.
agent-> setTitleBar (myTitleBar); بعد ذلك ، يلمح تعيين زر SET SYSTEM للسماح WidgetWindowAgent بمعرفة دور عناصر واجهة المستخدم ، وهو أمر مهم لتخطيط SNAP للعمل.
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 ());لا يعني القيام بذلك أن أحداث النقر فوق هذه الأزرار ترتبط تلقائيًا بإجراءات النوافذ ، لا تزال بحاجة إلى توصيل الإشارات والفتحات يدويًا لمحاكاة سلوكيات النوافذ الأصلية.
على MacOS ، يمكن تخطي هذه الخطوة لأنه من الأفضل استخدام الأزرار التي يوفرها النظام.
أخيرًا وليس آخرًا ، قم بتعيين تلميح مرئي للاختبار للسماح للضرب بالتعرف على العناصر WidgetWindowAgent التي ترغب في تلقي أحداث الماوس.
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);ستُعتبر منطقة REST داخل شريط العنوان هي منطقة قابلة للسحب للمستخدم لنقل النافذة ، وبالتالي لن تتلقى أي QWidgets بداخلها أي أحداث تفاعل المستخدم مثل أحداث الماوس/التركيز/إلخ بعد الآن ، ولكن لا يزال بإمكانك إرسال/نشر هذه الأحداث إلى هذه الأدوات المصغرة يدويًا ، إما من خلال واجهة برمجة تطبيقات QT أو نظام واجهة برمجة تطبيقات النظام.
Qt::WindowMaximizeButtonHint من النافذة. تأكد من قيامك بتسجيل QWindowKit في Qtquick:
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
} بعد ذلك ، يمكنك استخدام أنواع بيانات QWindowKit وفئاتها عن طريق استيراد 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
// ...
}
}يمكنك حذف رقم الإصدار أو استخدام "Auto" بدلاً من "1.0" للوحدة URI إذا كنت تستخدم QT6.
كما ذكرنا للتو أعلاه ، إذا كنت ستقوم بتعيين قيود الحجم ، فيرجى القيام بذلك بعد windowAgent.setup() .
انظر أمثلة لمزيد من حالات الاستخدام التجريبي. الأمثلة ليس لها دعم مرتفع DPI.
Qt::WA_NativeWindow تم تمكينها كحالة من النافذة بدون إطار ، فيجب عليك تمكين Qt::WA_DontCreateNativeAncestors مقدمًا. GetWindowRect أو GetClientRect . يكمن السبب الجذري في تطبيقات QT QPA ، ولا نعرف حاليًا كيفية إصلاحه دون تعديل QT نفسه. Qwindowkit مرخصة بموجب ترخيص Apache 2.0.