0

私の問題の一部についても参照してください: JavaScript から Qt/C++ オブジェクトへの文字列の受け渡し

WebPage私はWebView(を使用して)このカスタムを使用setPageしていますが、文字列が間違って渡されます。の呼び出しを無効にするとsetPage、文字列が正しく渡されました。

QWidgetWebページにactiveXを表示するC++オブジェクト(から継承)があります(ActiveQtおよびを使用QWebView)。ActiveX オブジェクトは正常に表示されます。カスタム タイプを登録し、Qt MetaType システムを使用して HTML オブジェクトをインスタンス化しました。

その C++ オブジェクト (ActiveX ではない) のプロパティを更新し、JavaScript から呼び出したい場合、文字列は間違った変換などを取得します。文字列を渡すと、C++ メソッドで 1 文字の文字列しか取得できません。メモリを表示すると、文字列全体が存在することがわかります (UTF-32 としてフォーマットされています)。

WebPageプラグインをロードするカスタムを ( setPageon を使用して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);
4

1 に答える 1

0

おそらく 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 <------

そのため、何らかの理由で dataTransfer データの取得に失敗します。なんで?Linux では文字列が返されますが、t[]e[]s[]t[] のようにフォーマットされています。エンコードの問題のようです。

于 2011-11-04T20:33:05.350 に答える