Skip to content
This repository has been archived by the owner on Dec 19, 2023. It is now read-only.

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

Open
zhiyiYo opened this issue Dec 17, 2023 · 18 comments
Open

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

zhiyiYo opened this issue Dec 17, 2023 · 18 comments

Comments

@zhiyiYo
Copy link

zhiyiYo commented Dec 17, 2023

问题描述

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

环境信息

  • Windows 11 23H2
  • Qt SDK: 6.5.2 MSVC
  • FramelessHelper git 版本: c4a7bc8

截图

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
Copy link
Collaborator

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

@zhiyiYo
Copy link
Author

zhiyiYo commented Dec 17, 2023

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

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

@SineStriker
Copy link
Collaborator

SineStriker commented Dec 17, 2023

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

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

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

@zhiyiYo
Copy link
Author

zhiyiYo commented Dec 17, 2023

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

@SineStriker
Copy link
Collaborator

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

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

@SineStriker
Copy link
Collaborator

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

@SineStriker
Copy link
Collaborator

SineStriker commented Dec 17, 2023

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

@zhiyiYo
Copy link
Author

zhiyiYo commented Dec 17, 2023

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

@SineStriker
Copy link
Collaborator

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

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

@SineStriker
Copy link
Collaborator

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

@SineStriker
Copy link
Collaborator

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

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

@zhiyiYo
Copy link
Author

zhiyiYo commented Dec 18, 2023

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

@zhiyiYo
Copy link
Author

zhiyiYo commented Dec 18, 2023

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

@SineStriker
Copy link
Collaborator

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

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

@zhiyiYo
Copy link
Author

zhiyiYo commented Dec 18, 2023

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

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

@zhiyiYo
Copy link
Author

zhiyiYo commented Dec 18, 2023

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

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

@SineStriker
Copy link
Collaborator

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

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

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

@zhiyiYo
Copy link
Author

zhiyiYo commented Dec 18, 2023

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants