QT 5.1.1:QWebview 中的复选框在 Win 7 (x64) / Win 8 下显示奇怪的行为

Posted

技术标签:

【中文标题】QT 5.1.1:QWebview 中的复选框在 Win 7 (x64) / Win 8 下显示奇怪的行为【英文标题】:QT 5.1.1: Checkbox in QWebview shows strange behavior under Win 7 (x64) / Win 8 【发布时间】:2013-11-12 22:29:37 【问题描述】:

我的项目在基于 Qt 5.1.1(MSVC 2010,32 位)的 QT Creator 2.8.1 中,并使用套件编译:QT 5.1.1 MSVC2010 32 位。

问题是 webview 在 Win 7 (x64) 或 Win 8 下显示了一些奇怪的行为。第一个复选框始终是焦点。如果我将鼠标悬停在第一个复选框上,第二个会“突出显示”。我也不能选中第一个复选框,如果我点击它,第二个会被选中,而第一个保持未选中。

在 Win XP 下使用相同的 exe 或在 Linux 或 Mac 上重新编译的项目不会出现此错误。

html

<p><input id="loginA" tabindex="3" type="checkbox" name="a" /> Test 1<br/></p> <p><input id="loginB" tabindex="4" type="checkbox" name="b" /> Test 2<br/></p>

C++/QT5 中的 QWebview 部分:

QVariant result = this-&gt;webv-&gt;page()-&gt;mainFrame()-&gt;evaluatejavascript(jscontent);

如果我通过 web 检查器的控制台设置了 checked 属性,它会显示与描述相同的行为,并且只有第二个被选中。

$(":checkbox").attr("checked", true) [<input id=​"loginA" tabindex=​"3" type=​"checkbox" name=​"a" checked=​"checked">​, <input id=​"loginB" tabindex=​"4" type=​"checkbox" name=​"b" checked=​"checked">​]

有什么建议吗??非常感谢您的帮助。

【问题讨论】:

在编译了一个qt示例并得到相同的结果后...我写了一个错误报告:https://bugreports.qt-project.org/browse/QTBUG-34835 通过https://bugreports.qt-project.org/browse/QTBUG-34163https://bugreports.qt-project.org/browse/QTBUG-34163此处解释的解决方法解决了 【参考方案1】:

这是完整的解决方法:

创建一个扩展 QProxyStyle 的 CustomStyle 类:

#ifndef CUSTOMSTYLE_H
#define CUSTOMSTYLE_H

#include <QProxyStyle>
#include <QStyleOption>

class CustomStyle : public QProxyStyle

    void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget = 0) const
    
        if (element == QStyle::CE_CheckBox || 
            element == QStyle::CE_RadioButton) 
            option->styleObject->setProperty("_q_no_animation", true);                          
        
        QProxyStyle::drawControl(element, option, painter, widget);
    
;

#endif //CUSTOMSTYLE_H

将 CustomStyle 设置为您的应用程序或 webview 组件:

// like this
QApplication::setStyle(new CustomStyle());

// or like this
ui->webview->setStyle(new CustomStyle());

请注意,您的 QWebView 组件不得设置其“styleSheet”属性。它必须是空的。否则它将以某种方式覆盖我们的自定义样式,并且解决方法将不起作用。

【讨论】:

以上是关于QT 5.1.1:QWebview 中的复选框在 Win 7 (x64) / Win 8 下显示奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.3 Webkit QWebView中的Javascript太慢了,在Windows上挂了MainWindow

QT 从 QWebView 的 QNetworkAccessManager 读取数据

JWPlayer 在 Qt5 QWebView 中不可见

覆盖 QWebView 中的页面回复

在 Qt 中,QWebView 和 QNetworkRequest 不能共享 cookie

QWebView 类是不是在 Qt 5.0.0 中工作?