กรอบการปรับแต่งหน้าต่างข้ามแพลตฟอร์มสำหรับวิดเจ็ต QT และ QT Quick
โครงการนี้สืบทอดการใช้งาน Wangwenx190 FramelessHelper ส่วนใหญ่ด้วยการปรับโครงสร้างและการอัพเกรดสถาปัตยกรรมที่สมบูรณ์
ยินดีต้อนรับคำขอคุณสมบัติ
คุณสามารถแบ่งปันสิ่งที่ค้นพบความคิดและแนวคิดเกี่ยวกับการปรับปรุง / ใช้งานฟังก์ชัน QWindowKit บนแพลตฟอร์มและแอพเพิ่มเติม!


| แม็กอส | Linux (Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami เป็นซอฟต์แวร์การสื่อสารแบบ end-to-end ฟรี/libre
Tietie เป็นซอฟต์แวร์การจัดการคลิปบอร์ดที่ใช้งานง่ายและใช้งานง่าย การสนับสนุนแบบหลายรูปแบบความสามารถในการค้นหาที่ทรงพลัง
| ส่วนประกอบ | ความต้องการ | รายละเอียด |
|---|---|---|
| qt | > = 5.12 | Core, GUI, วิดเจ็ต, ด่วน |
| ผู้ประกอบการ | > = 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 สำหรับการใช้งานโดยละเอียด
การเริ่มต้นต่อไปนี้ควรทำก่อนที่จะสร้างวิดเจ็ตใด ๆ
# 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 ซึ่งจะส่งผลต่อวิธีการคำนวณขนาดหน้าต่างและทำให้คุณต้องปล่อยให้ QWINDOWKIT เริ่มต้นที่จุดเริ่มต้น
จากนั้นสร้างวิดเจ็ตแท่งชื่อของคุณโดยที่หน้าต่างไม่มีคุณสมบัติการโต้ตอบพื้นฐานและจะดีกว่าที่จะนำมันเข้าไปในรูปแบบของหน้าต่าง
คุณสามารถใช้ WindowBar ที่จัดทำโดย WidgetFrame ในตัวอย่างเป็นคอนเทนเนอร์ของส่วนประกอบแถบชื่อเรื่องของคุณ
ให้ WidgetWindowAgent ทราบว่าวิดเจ็ตแถบชื่อเรื่องใด
agent-> setTitleBar (myTitleBar); ถัดไปตั้งค่าปุ่มระบบเพื่อให้ 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);พื้นที่ส่วนที่เหลือภายในแถบชื่อเรื่องจะถือเป็นพื้นที่ที่มีความสามารถในการเคลื่อนย้ายได้สำหรับผู้ใช้ในการย้ายหน้าต่างและทำให้ QWidgets ใด ๆ อยู่ข้างในนั้นจะไม่ได้รับเหตุการณ์การโต้ตอบกับผู้ใช้เช่นเหตุการณ์เมาส์/เหตุการณ์โฟกัส/ฯลฯ อีกต่อไป แต่คุณยังสามารถส่ง/โพสต์เหตุการณ์ดังกล่าวไปยังวิดเจ็ตเหล่านี้ด้วยตนเอง
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
// ...
}
}คุณสามารถละเว้นหมายเลขเวอร์ชันหรือใช้ "อัตโนมัติ" แทน "1.0" สำหรับโมดูล URI หากคุณใช้ QT6
ดังที่เราเพิ่งกล่าวถึงข้างต้นหากคุณกำลังจะตั้งค่าข้อ จำกัด ขนาดโปรดทำหลังจาก windowAgent.setup() เรียกว่า
ดูตัวอย่างสำหรับกรณีการใช้งานตัวอย่างเพิ่มเติม ตัวอย่างไม่มีการสนับสนุน DPI สูง
Qt::WA_NativeWindow ที่เปิดใช้งานเป็นลงมาของหน้าต่างไร้กรอบคุณควรเปิดใช้งาน Qt::WA_DontCreateNativeAncestors ของมันล่วงหน้า GetWindowRect หรือ GetClientRect สาเหตุที่แท้จริงอยู่ลึกลงไปในการใช้งาน QT QPA และในปัจจุบันเราไม่ทราบวิธีการแก้ไขโดยไม่ต้องแก้ไข QT เอง QWindowKit ได้รับใบอนุญาตภายใต้ใบอนุญาต Apache 2.0