String Qt Webkit桥ActiveQt字符串

String Qt Webkit桥ActiveQt字符串,string,qt,webkit,activeqt,String,Qt,Webkit,Activeqt,另请参见我的部分问题: 在我的WebView(使用setPage)上使用此自定义WebPage),字符串传递错误。当我禁用调用setPage时,字符串正确传递 我有一个C++对象(继承自 qWIDGET ),它在网页上显示一个ActiveX(使用 ActiveQt< /Cord>和 QWebVIEW)。ActiveX对象显示得很好。我已经注册了自定义类型,并使用Qt元类型系统来实例化HTML对象 如果我想更新C++对象的属性(不是ActiveX)并从JavaScript调用,字符串会得到错误的翻

另请参见我的部分问题:

在我的
WebView
(使用
setPage
)上使用此自定义
WebPage
),字符串传递错误。当我禁用调用
setPage
时,字符串正确传递

我有一个C++对象(继承自<代码> qWIDGET ),它在网页上显示一个ActiveX(使用<代码> ActiveQt< /Cord>和<代码> QWebVIEW)。ActiveX对象显示得很好。我已经注册了自定义类型,并使用Qt元类型系统来实例化HTML对象

如果我想更新C++对象的属性(不是ActiveX)并从JavaScript调用,字符串会得到错误的翻译等等。如果我通过一些字符串,我只在C++方法中得到一个字符串1字符。查看内存告诉我整个字符串都存在(格式化为UTF-32)

如果我现在不调用为我加载插件的自定义
网页
(在
QWebView
上使用
setPage
),我将无法获得预期的ActiveX,并且字符串被正确传递

我不太明白为什么这不起作用。即使使用<代码> SETPUT> /代码>,我还是通过JavaScript /QTWebKIT桥来与C++对象对话,而不是ActiveX组件。 我在Windows7上,64位,使用Qt4.7.4

一些代码(C++):

类设备:公共QWidget
{
Q_对象
公众:
显式设备(QWidget*parent=0);
设备(常数设备和其他);
设备和操作员=(常数设备和其他);
~Device();
QString name()常量;
void setName(QString);
Q_属性(QString名称读取名称写入集合名称通知名称更改)
信号:
无效名称已更改(QString);
私人:
QAxWidget*ax;
};
Q_DECLARE_元类型(设备);
设备::设备(QWidget*parent/*=0*/)
:QWidget(父项)
{
ax=新的QAxWidget(此);
ax->setControl(“{…}”);
}
QString设备::name()常量
{
返回_name;
}
无效设备::setName(QString名称)
{
如果(_name!=name){
_名称=名称;
更改名称(名称);
}
}
//需要ActiveQt对象才能工作
类映射页:公共QWeb页
{
Q_对象
受保护的:
QObject*createPlugin(常量QString和classId、常量QUrl和url、常量QString和ParamName、常量QString和paramValues);
公众:
MapPage(QObject*parent=0);
};
// ============================================================================
//需要ActiveQt对象才能工作
MapPage::MapPage(QObject*parent/*=0*/)
:QWebPage(家长)
{
qRegisterMetaType();
settings()->setAttribute(QWebSettings::PluginsEnabled,true);
}
QObject*MapPage::createPlugin(常量QString和classId、常量QUrl和url、常量QString和ParamName、常量QString和paramValues)
{
//使用QUiLoader创建小部件,这意味着小部件不需要向元对象系统注册(仅适用于gui对象!)。
装载机;
QObject*result=0;//loader.createWidget(classId,view());
//如果加载失败,请使用Qt元类型系统;预期从QObject派生的对象
如果(!结果){
//结果=static_cast(QMetaType::construct(QMetaType::type(classId.toLatin1()));
int id=QMetaType::type(“设备”);
void*classPtr=QMetaType::construct(id);
结果=静态铸件(classPtr);
}
返回结果;
}
然后在我的窗户上

qRegisterMetaType<Device>();
mapPage = new MapPage(this);
ui.webView->setPage(mapPage);   // Needed for ActiveQt objects to work - makes strings broken
...
ui.webView->setHtml(src);
qRegisterMetaType();
mapPage=新的mapPage(本);
ui.webView->setPage(mapPage);//需要ActiveQt对象才能工作-使字符串断开
...
ui.webView->setHtml(src);

将其缩小为一个可能与JavaScript/HTML相关的问题

//device.name = 'test'; // works 
var str = 'test'; 
previewCameo.view = str; // works 
但是当我通过HTML拖放事件(使用e.dataTransfer)获得名称时,它失败了

var name = e.dataTransfer.getData('name'); 
alert(name); // shows correct name 
device.name = name; // fails <------ 
device.name = e.dataTransfer.getData('name'); // fails <------
var name=e.dataTransfer.getData('name');
警报(名称);//显示正确的名称

device.name=name;//失败。似乎e.dataTransfer.getData()未返回正确的UTF-16字符串。在内部,JS可以正确地处理这个问题,但是当桥接到C++时,它失败了。
var name = e.dataTransfer.getData('name'); 
alert(name); // shows correct name 
device.name = name; // fails <------ 
device.name = e.dataTransfer.getData('name'); // fails <------