另見我的問題的一部分:String passing from JavaScript to Qt/C++ object的Qt Webkit的橋樑ActiveQt可串
我用這個自定義WebPage
我WebView
(使用setPage
),該字符串在錯誤地通過。當我禁用調用setPage
時,字符串正確傳遞。
我有一個C++對象(它繼承自QWidget
),它在網頁上顯示一個activeX(使用ActiveQt
和QWebView
)。 ActiveX對象顯示得很好。我已經註冊了自定義類型,並使用Qt MetaType系統來實例化HTML對象。
如果我想更新該C++對象(不是ActiveX)的屬性並從JavaScript調用,則該字符串得到錯誤的翻譯等等。如果我傳入一些字符串,我的C++方法只會得到一個1個字符的字符串。查看內存告訴我整個字符串都存在(格式爲UTF-32)。
如果我現在不打電話給我加載插件的自定義WebPage
(使用在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);
似乎e.dataTransfer.getData()不會返回正確的UTF-16字符串。在JS的內部,它可以正確處理這個問題,但是當橋接到C++時會失敗。 – BCL