QT 위젯 및 QT Quick의 크로스 플랫폼 창 사용자 정의 프레임 워크.
이 프로젝트는 대부분의 Wangwenx190 FramelessHelper 구현을 물려 받았으며, 아키텍처의 완전한 리팩토링 및 업그레이드.
기능 요청을 환영합니다.
더 많은 플랫폼 및 앱에서 QWINDOWKIT 기능을 개선 / 구현하는 것에 대한 발견, 생각 및 아이디어를 공유 할 수 있습니다!


| 마코스 | 리눅스 (우분투 20.04) |
|---|---|
![]() | ![]() |
Jami는 무료/libre, 엔드 투 엔드 암호화 및 개인 커뮤니케이션 소프트웨어입니다.
Tietie는 간단하고 사용하기 쉬운 클립 보드 관리 소프트웨어입니다. 다중 공식 지원, 강력한 검색 능력.
| 요소 | 요구 사항 | 세부 |
|---|---|---|
| QT | > = 5.12 | 코어, 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 Guide를 참조하십시오.
위젯 구성 전에 다음 초기화를 수행해야합니다.
# include < QtWidgets/QApplication >
int main ( int argc, char *argv[])
{
QGuiApplication::setAttribute (Qt::AA_DontCreateNativeWidgetSiblings)
// ...
} 먼저, 상위 QWidget 인스턴스를 위해 WidgetWindowAgent 설정하십시오. (각 창은 자체 에이전트가 필요합니다.)
# 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가 처음에 초기화하도록해야합니다.
그런 다음 창에 기본 상호 작용 기능이없는 타이틀 막대 위젯을 구성하고 창의 레이아웃에 넣는 것이 좋습니다.
예제에서 WidgetFrame 에서 제공 한 WindowBar 제목 표시 줄 구성 요소의 컨테이너로 사용할 수 있습니다.
WidgetWindowAgent 제목 표시 줄이 어느 위젯인지 알려주십시오.
agent-> setTitleBar (myTitleBar); 다음으로, 시스템 버튼 힌트 힌트는 WidgetWindowAgent 어린이 위젯의 역할을 알리기 위해 스냅 레이아웃이 작동하는 데 중요합니다.
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);제목 표시 줄의 나머지 영역은 사용자가 창을 이동할 수있는 드래그 가능한 영역으로 간주되므로 내부의 QWIDGET은 더 이상 마우스 이벤트/초점 이벤트 등과 같은 사용자 상호 작용 이벤트를받지 못하지만 QT API 또는 System API를 통해 이러한 위젯을 수동으로 전송/게시 할 수 있습니다.
Qt::WindowMaximizeButtonHint 플래그를 제거 할 수 있습니다. QWindowKit Qtquick에 등록했는지 확인하십시오.
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
} 그런 다음 URI를 가져와 QWindowKit 데이터 유형 및 클래스를 사용할 수 있습니다.
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
// ...
}
}QT6을 사용하는 경우 모듈 URI의 "1.0"대신 버전 번호를 생략하거나 "Auto"를 사용할 수 있습니다.
위에서 방금 언급했듯이 크기 제약 조건을 설정하려면 windowAgent.setup() 호출 된 후에하십시오.
더 많은 데모 사용 사례에 대한 예제를 참조하십시오. 예제는 높은 DPI 지원이 없습니다.
Qt::WA_NativeWindow 속성으로 위젯을 추가하려는 경우 Qt::WA_DontCreateNativeAncestors 를 미리 활성화해야합니다. GetWindowRect 또는 GetClientRect 와 같은 시스템 API를 사용하여이를 해결할 수 있습니다. 근본 원인은 QT QPA 구현에 깊이 있고 현재 QT 자체를 수정하지 않고 수정하는 방법을 모릅니다. QWINDOWKIT는 Apache 2.0 라이센스에 따라 라이센스가 부여됩니다.