另请参阅我的部分问题:String passing from JavaScript to Qt/C++ object
我在WebPage
上使用此自定义WebView
(使用setPage
),错误地传递了字符串。当我禁用调用setPage
时,字符串正确传递。
我有一个C ++对象(继承自QWidget
),在网页上显示activeX(使用ActiveQt
和QWebView
)。 ActiveX对象显示得很好。我已经注册了自定义类型并使用Qt MetaType系统来实例化HTML对象。
如果我想更新该C ++对象(不是ActiveX)的属性并从JavaScript调用,则该字符串会得到错误的翻译。如果我传入一些字符串,我只能在我的C ++方法中获得一个1个字符的字符串。查看内存告诉我整个字符串都存在(格式化为UTF-32)。
如果我现在不调用为我加载插件的自定义WebPage
(在setPage
上使用QWebView
),我没有得到ActiveX - 这是预期的 - 并且字符串正确传递。
我不太明白为什么这不起作用。即使调用setPage
,我也是通过JavaScript / QtWebKit桥与C ++对象交谈,而不是与ActiveX组件交谈。
我在Windows 7,64位,使用Qt 4.7.4。
一些代码(C ++):
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;
}
然后在我的窗口
qRegisterMetaType<Device>();
mapPage = new MapPage(this);
ui.webView->setPage(mapPage); // Needed for ActiveQt objects to work - makes strings broken
...
ui.webView->setHtml(src);
答案 0 :(得分:0)
将其缩小到可能与JavaScript / HTML相关的问题。
//device.name = 'test'; // works
var str = 'test';
previewCameo.view = str; // works
但是当我通过HTML drag-n-drop事件(使用e.dataTransfer)获取名称时,它失败了
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 []。似乎是编码问题。