wangwenx190 / framelesshelper

Project moved to: https://github.com/stdware/qwindowkit Cross-platform window customization framework for Qt Widgets and Qt Quick. Supports Windows, Linux and macOS.
MIT License
849 stars 202 forks source link

使用 QWebEngineView 之后标题栏按钮无法交互 #336

Open zhiyiYo opened 11 months ago

zhiyiYo commented 11 months ago

问题描述

作者您好,我在无边框窗口中使用 QWebEngineView 时发现标题栏按钮无法正常交互,但是标题栏仍然可以拖动,请问这是已知的 bug 吗?

环境信息

截图

screenshot

最小复现代码

#include <FramelessHelper/Widgets/FramelessWidgetsHelper>
#include <FramelessHelper/Widgets/StandardTitleBar>
#include <QApplication>
#include <QDesktopServices>
#include <QTimer>
#include <QVBoxLayout>
#include <QWebEngineView>
#include <framelessconfig_p.h>

FRAMELESSHELPER_USE_NAMESPACE
using namespace Global;

class Demo : public QWidget
{
    Q_OBJECT
public:
    Demo(QWidget* parent = nullptr)
        : QWidget(parent),
          titleBar(new StandardTitleBar(this)),
          webView(new QWebEngineView(this)),
          vBoxLayout(new QVBoxLayout(this))
    {
        FramelessWidgetsHelper::get(this)->extendsContentIntoTitleBar();

        webView->load(QUrl("https://www.baidu.com"));

        resize(1000, 750);

        vBoxLayout->addWidget(titleBar);
        vBoxLayout->addWidget(webView);
        vBoxLayout->setContentsMargins(0, 0, 0, 0);

        // set up title bar
        FramelessWidgetsHelper* helper = FramelessWidgetsHelper::get(this);
        helper->setTitleBarWidget(titleBar);
        helper->setSystemButton(titleBar->minimizeButton(), SystemButtonType::Minimize);
        helper->setSystemButton(titleBar->maximizeButton(), SystemButtonType::Maximize);
        helper->setSystemButton(titleBar->closeButton(), SystemButtonType::Close);

        titleBar->raise();
    }

private:
    StandardTitleBar* titleBar;
    QWebEngineView* webView;
    QVBoxLayout* vBoxLayout;
};

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    Demo w;
    w.show();

    return app.exec();
}

#include "main.moc"

最小复现工程

使用的是无边框窗口的静态链接库 TestFramelessWebEngine.zip

SineStriker commented 11 months ago

兄弟,试试这个。https://github.com/stdware/qwindowkit/tree/webview-test 打开mainwindow的example就行,临时搞了个分支,暂时只在windows上试了。

zhiyiYo commented 11 months ago

兄弟,试试这个。https://github.com/stdware/qwindowkit/tree/webview-test 打开mainwindow的example就行,临时搞了个分支,暂时只在windows上试了。

感谢,我看了一下仓库的代码,似乎和原本的无边框库差异挺大的

SineStriker commented 11 months ago

兄弟,试试这个。https://github.com/stdware/qwindowkit/tree/webview-test 打开mainwindow的example就行,临时搞了个分支,暂时只在windows上试了。

感谢,我看了一下仓库的代码,似乎和原本的无边框库差异挺大的

FramelessHelper不久后就会废弃了,大部分实现已经搬了过去,并做了优化,然后修复了已有的很多缺陷,麻烦您看看qwindowkit有没有出现你这个issue。文档暂时没写,只需要参考看看mainwindow的用法就行。

zhiyiYo commented 11 months ago

好像有两个标题栏,感觉这个库 api 变化有亿点大,用户侧还是得写不少代码: image

SineStriker commented 11 months ago

好像有两个标题栏,感觉这个库 api 变化有亿点大,用户侧还是得写不少代码: image

是吗?我这里很正常啊。 image 会不会是因为我是Qt 5.15的问题,我去编译一个Qt6逝世。

SineStriker commented 11 months ago

我用qt6试了,确实问题很大...

SineStriker commented 11 months ago

我找到问题的原因了,我这边qt6运行那段代码会导致直接崩溃。原因是因为把QWebEngineView设为central widget的时候会使窗口句柄发生变化,Qt6和Qt5的实现貌似不一样。给我点时间去把它解决了。

zhiyiYo commented 11 months ago

目前 FramelessHelper 对用户代码的侵入性几乎为 0 了,如果新的库也能做到这一点就好了

SineStriker commented 11 months ago

目前 FramelessHelper 对用户代码的侵入性几乎为 0 了,如果新的库也能做到这一点就好了

没有明白侵入性是啥。新的库跟FramelessHelper的接口基本是一致的,我感觉迁移挺方便的吧?

SineStriker commented 11 months ago

添加了对WinIdChange的监视,我这边用Qt 6.5.1编译,使用WebEngineView作为central widget没发现问题。麻烦您有空的时候试一试。还是https://github.com/stdware/qwindowkit/tree/webview-test的mainwindow example。

SineStriker commented 11 months ago

目前 FramelessHelper 对用户代码的侵入性几乎为 0 了,如果新的库也能做到这一点就好了

请问你是想让qwk做出哪些具体的修改呢?

zhiyiYo commented 11 months ago

不好意思刚看到,晚上我试试

zhiyiYo commented 11 months ago

@SineStriker 测试了一下没有问题 image

SineStriker commented 11 months ago

@SineStriker 话说 -DQWindowKit_DIR=/path/install/cmake/QWindowKit 参数有起作用吗,貌似没在 cmake 里面看到这个配置项

这是给你要引入QWindowKit的项目用的,给find_package搜索库用的...直接构建QWindowKit不需要。另外那个侵入性的问题,方便把建议或者需求说详细一些吗?

zhiyiYo commented 11 months ago

这是给你要引入QWindowKit的项目用的,给find_package搜索库用的

学废了,之前都是手动打的包

zhiyiYo commented 11 months ago

外那个侵入性的问题,方便把建议或者需求说详细一些吗?

昨天粗略看了一下 mainwindow.cpp,发现里面代码量挺大的,今天又看了一下才知道大多数都是构建标题栏用的代码。如果能给个最小示例的话可能会比较适合快速上手

SineStriker commented 11 months ago

外那个侵入性的问题,方便把建议或者需求说详细一些吗?

昨天粗略看了一下 mainwindow.cpp,发现里面代码量挺大的,今天又看了一下才知道大多数都是构建标题栏用的代码。如果能给个最小示例的话可能会比较适合快速上手

emm...对的,FramelessHelper里面代码比较冗余,我们商量了一下把除了核心功能以外的东西全去了,所以需要用户自己构建标题栏。这个会详细在文档里介绍的,现在main分支的README其实就写了点文档,之后还会补充。

zhiyiYo commented 11 months ago

支持,经常不知道要 include 哪一个头文件