QT小部件和QT快速的跨平台窗口自定义框架。
该项目继承了Wangwenx190 FramelessHelper实现的大部分,并完全重构和升级了体系结构。
欢迎功能请求。
您可以在更多平台和应用程序上分享有关改进 /实施Qwindowkit功能的发现,想法和想法!


| macos | Linux(Ubuntu 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阅读root 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)
// ...
}首先,为您的顶级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知道儿童小部件的作用,这对于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上,可以跳过此步骤,因为最好使用系统提供的按钮。
最后但并非最不重要的一点是,设置HIT测试可见提示,让WidgetWindowAgent知道哪些小部件愿意接收鼠标事件。
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);标题栏内的其余区域将被视为用户移动窗口的可拖动区域,因此,内部的任何QWIDGETS都不会再接收任何用户交互事件,例如鼠标事件/focus Events/etc,但是您仍然可以通过QT API或系统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,则可以省略版本号或使用“自动”代替“ 1.0”。
如上所述,如果您要设置大小约束,请在windowAgent.setup()之后进行。
有关更多演示用例,请参见示例。这些示例没有很高的DPI支持。
Qt::WA_NativeWindow属性作为“无框窗口的后代”启用的小部件,则应提前启用Qt::WA_DontCreateNativeAncestors 。 GetWindowRect或GetClientRect解决此问题。根本原因在于QT QPA实现,目前我们不知道如何在不修改QT本身的情况下修复它。 Qwindowkit已获得Apache 2.0许可证的许可。