2011-11-04 77 views
0

另見我的問題的一部分:String passing from JavaScript to Qt/C++ object的Qt Webkit的橋樑ActiveQt可串

我用這個自定義WebPageWebView(使用setPage),該字符串在錯誤地通過。當我禁用調用setPage時,字符串正確傳遞。

我有一個C++對象(它繼承自QWidget),它在網頁上顯示一個activeX(使用ActiveQtQWebView)。 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); 

回答

0

的範圍縮小到可能與JavaScript的/ HTML的問題。

//device.name = 'test'; // works 
var str = 'test'; 
previewCameo.view = str; // works 

但是當我通過HTML拖N - 下降事件得到的名稱(用e.dataTransfer),它失敗

var name = e.dataTransfer.getData('name'); 
alert(name); // shows correct name 
device.name = name; // fails <------ 
device.name = e.dataTransfer.getData('name'); // fails <------ 

所以數據傳遞檢索數據由於某種原因失敗。爲什麼? 在Linux上,我確實收到了一個字符串,但它的格式如t [] e [] s [] t []。看起來像一個編碼問題。

+0

似乎e.dataTransfer.getData()不會返回正確的UTF-16字符串。在JS的內部,它可以正確處理這個問題,但是當橋接到C++時會失敗。 – BCL