2016-08-24 12 views
6

Trong công cụ tạo tập lệnh của Qt 4.8, các biến "cục bộ" có thể được đặt bởi obtaining a QScriptContext from QScriptEngine::pushContext then setting the properties of its activation object. Điều này chỉ có thể được thực hiện trong vòng cuộc gọi push/pop, vì đó là nơi duy nhất một QScriptContext có sẵn và AFAICT không có tương đương với QScriptEngine#evaluate mà phải mất một QScriptContext để sử dụng như môi trường:Có cách nào để duy trì môi trường ngữ cảnh kịch bản Qt bên ngoài QScriptEngine # pushContext/popContext không?

QScriptEngine engine; 
QScriptContext *local; 

local = engine.pushContext(); 
local->activationObject().setProperty("value", 2); // set value=2 
qDebug() << engine.evaluate("value").toNumber(); // outputs 2 
engine.popContext(); 

Có một số cách để duy trì một môi trường để sử dụng với các đánh giá bên ngoài của các cuộc gọi push/pop? Ví dụ: tôi đã thử tạo một QScriptValue để sử dụng làm đối tượng kích hoạt và sau đó đặt nó:

QScriptEngine engine; 
QScriptContext *local; 

// Use ao as activation object, set variables here, prior to pushContext. 
QScriptValue ao; 
ao.setProperty("value", 1); 

// Test with ao: 
local = engine.pushContext(); 
local->setActivationObject(ao); 
qDebug() << engine.evaluate("value").toNumber(); 
engine.popContext(); 

Nhưng điều đó không hiệu quả. Nó xuất kết quả nan thay vì 1, dưới dạng value không xác định. Vì một lý do nào đó, setActivationObject không thay đổi giá trị.

mục tiêu chung của tôi là:

  1. Thiết lập một môi trường địa phương bên ngoài của mã đánh giá.
  2. Sau đó, sử dụng môi trường cục bộ được định cấu hình trước đó khi đánh giá tập lệnh giữa các cuộc gọi pushContextpopContext mà không phải đặt lại tất cả các biến trong môi trường đó mọi lúc.

Vì vậy:

  • Có cách nào để làm điều này?
  • Tôi có thể đi đúng hướng nhưng tôi đã thiết lập ao không đúng cách? Ví dụ: có QScriptEngine#newActivationObject() không có giấy tờ mang lại lỗi "chưa được thực hiện" khi được sử dụng, có lẽ đây là gợi ý?

Làm cách nào tôi có thể thiết lập ngữ cảnh cục bộ nhưng về cơ bản không phải định cấu hình lại mỗi khi tôi đẩy ngữ cảnh (vì về cơ bản nó bị mất đi mỗi khi tôi bật ngữ cảnh).

Trả lời

2

Bạn có thể sử dụng đối tượng chung. Nó sẽ chia sẻ giá trị tài sản accross tất cả các đánh giá:

#include <QCoreApplication> 
#include <QDebug> 
#include <QtScript/QScriptEngine> 
#include <QtScript/QScriptContext> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    QScriptEngine engine; 

    engine.globalObject().setProperty("value", 2); 
    engine.globalObject().setProperty("value2", 3); 

    qDebug() << engine.evaluate("value").toNumber(); // outputs 2 
    qDebug() << engine.evaluate("value2").toNumber(); // outputs 3 


    return a.exec(); 
} 

Hoặc nếu bạn không muốn phạm vi toàn cầu:

#include <QCoreApplication> 
#include <QDebug> 
#include <QtScript/QScriptEngine> 
#include <QtScript/QScriptContext> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    QScriptEngine engine; 
    QScriptContext *context; 

    QScriptValue scope = engine.newObject(); 
    scope.setProperty("value", 1); 
    scope.setProperty("value2", 2); 

    context = engine.pushContext(); 

    context->pushScope(scope); 
    qDebug() << engine.evaluate("value").toNumber(); // outputs 1 
    qDebug() << engine.evaluate("value2").toNumber(); // outputs 2 

    engine.popContext(); 

    return a.exec(); 
} 
+0

Oh mát mẻ, cảm ơn. Có vẻ như 'QScriptContext # pushScope' không được ghi lại trong bất kỳ phiên bản Qt nào; vì vậy tôi đã hỏi về nó trên các diễn đàn Qt. Rõ ràng nó là nội bộ và không thực sự sử dụng công cộng, về mặt lý thuyết có nghĩa là nó có thể biến mất bất cứ lúc nào, nhưng mặt khác QtScript không còn được dùng như một phiên bản Qt mới hơn nên nó không thực sự thêm bất kỳ rủi ro nào rồi. Và nó * làm * làm việc và đáp ứng yêu cầu của tôi, tôi không nghĩ rằng có bất cứ điều gì tốt hơn. Cảm ơn! –

Các vấn đề liên quan