首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt Webkit网桥ActiveQt字符串

Qt Webkit网桥ActiveQt字符串
EN

Stack Overflow用户
提问于 2011-11-04 18:44:06
回答 1查看 1.1K关注 0票数 0

另请参阅我的问题的一部分:String passing from JavaScript to Qt/C++ object

我在我的WebView上使用这个自定义的WebPage (使用setPage),字符串被错误地传入。当我禁用调用setPage时,字符串可以正确传递。

我有一个C++对象(继承自QWidget),它在网页上显示activeX (使用ActiveQtQWebView)。ActiveX对象显示得很好。我已经注册了自定义类型并使用Qt系统来实例化MetaType对象。

如果我想要更新C++对象(而不是ActiveX)属性并从JavaScript调用,字符串可能会得到错误的转换。如果我传入一些字符串,在我的C++方法上我只能得到一个1个字符的字符串。查看内存告诉我整个字符串都存在(格式化为UTF-32)。

如果我现在不调用为我加载插件的自定义WebPage (在QWebView上使用setPage ),我就得不到预期的ActiveX,字符串也会被正确传递。

我不太明白为什么这个不起作用。即使调用了setPage,我也是通过JavaScript/QtWebKit桥与C++对象通信,而不是与ActiveX组件通信。

我使用的是64位的Windows 7,使用的是Qt 4.7.4。

一些代码(C++):

代码语言:javascript
复制
class Device : public QWidget
{
    Q_OBJECT

public:
    explicit Device(QWidget* parent = 0);
    Device(const Device& other);
    Device& operator=(const Device& other);
    ~Device();

    QString name() const;
    void setName(QString);
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
signals:
    void nameChanged(QString);    
private:
    QAxWidget* ax;
};
Q_DECLARE_METATYPE(Device);

Device::Device(QWidget* parent/* = 0*/)
    : QWidget(parent)
{
    ax = new QAxWidget(this);
    ax->setControl("{...}");
}

QString Device::name() const
{
    return _name;
}

void Device::setName(QString name)
{
    if (_name != name) {
        _name = name;
        emit nameChanged(name);
    }
}

// Needed for ActiveQt objects to work
class MapPage : public QWebPage
{
    Q_OBJECT
protected:
    QObject* createPlugin(const QString& classId, const QUrl& url, const QStringList& paramNames, const QStringList& paramValues);

public:
    MapPage(QObject* parent = 0);
};

// ============================================================================
// Needed for ActiveQt objects to work
MapPage::MapPage(QObject* parent/* = 0*/)
    : QWebPage(parent)
{
    qRegisterMetaType<Device>();
    settings()->setAttribute(QWebSettings::PluginsEnabled, true);
}

QObject* MapPage::createPlugin(const QString& classId, const QUrl& url, const QStringList& paramNames, const QStringList& paramValues)
{
    // Create widget using QUiLoader, which means widgets don't need to be registered with meta object system (only for gui objects!).
    QUiLoader loader;

    QObject* result = 0;//loader.createWidget(classId, view());

    // If loading failed, use the Qt Metatype system; expect objects derived from QObject
    if (!result) {
        //result = static_cast<QWidget*>(QMetaType::construct(QMetaType::type(classId.toLatin1())));
        int id = QMetaType::type("Device");
        void* classPtr = QMetaType::construct(id);
        result = static_cast<QWidget*>(classPtr);
    }

    return result;
}

然后在我的窗户上

代码语言:javascript
复制
qRegisterMetaType<Device>();
mapPage = new MapPage(this);
ui.webView->setPage(mapPage);   // Needed for ActiveQt objects to work - makes strings broken
...
ui.webView->setHtml(src);
EN

回答 1

Stack Overflow用户

发布于 2011-11-05 04:33:05

已将范围缩小到可能与JavaScript/HTML有关的问题。

代码语言:javascript
复制
//device.name = 'test'; // works 
var str = 'test'; 
previewCameo.view = str; // works 

但是,当我通过HTML拖放事件(使用e.dataTransfer)获取名称时,它失败了

代码语言:javascript
复制
var name = e.dataTransfer.getData('name'); 
alert(name); // shows correct name 
device.name = name; // fails <------ 
device.name = e.dataTransfer.getData('name'); // fails <------

因此,由于某种原因,检索dataTransfer数据失败。为什么?在Linux上,我确实得到了一个字符串,但它的格式类似于t[]e[]s[]t[]。看起来像是编码问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8008064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档