私の問題の一部についても参照してください: JavaScript から Qt/C++ オブジェクトへの文字列の受け渡し
WebPage
私はWebView
(を使用して)このカスタムを使用setPage
していますが、文字列が間違って渡されます。の呼び出しを無効にするとsetPage
、文字列が正しく渡されました。
QWidget
WebページにactiveXを表示するC++オブジェクト(から継承)があります(ActiveQt
およびを使用QWebView
)。ActiveX オブジェクトは正常に表示されます。カスタム タイプを登録し、Qt MetaType システムを使用して HTML オブジェクトをインスタンス化しました。
その C++ オブジェクト (ActiveX ではない) のプロパティを更新し、JavaScript から呼び出したい場合、文字列は間違った変換などを取得します。文字列を渡すと、C++ メソッドで 1 文字の文字列しか取得できません。メモリを表示すると、文字列全体が存在することがわかります (UTF-32 としてフォーマットされています)。
WebPage
プラグインをロードするカスタムを ( setPage
on を使用してQWebView
) 呼び出さないと、ActiveX が取得されません (これは予期されることです)。文字列は正しく渡されます。
これがうまくいかない理由がよくわかりません。呼び出してもsetPage
、ActiveX コンポーネントではなく、JavaScript/QtWebKit ブリッジを介して C++ オブジェクトと通信しています。
Qt 4.7.4を使用して、64ビットのWindows 7を使用しています。
いくつかのコード (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);