Предполагая решение C ++, вы можете использовать промежуточный сигнал, например следующий для # 2:
connect(thisWidget, SIGNAL(clicked()),
thisWidget, SLOT(slotClickHandler()));
, затем:
void slotClickHandler()
{
QString s = "my variable string here";
emit sigDoSomething(s);
}
и их:
void slotDoSomething(const QString &s)
{
// Do something interesting with s here
}
Обратите внимание, что этот фрагмент предполагает, что вы определили новый сигнал sigDoSomething(const QString &)
и частный слот void slotDoSomething(const QString &)
.
Проблема в том, что вы каждый раз переназначаете объект options
, поскольку объекты являются ссылочными типами. Даже если бы вы сделали что-то подобное в своей функции: newOptions = options
вы бы все равно ссылались на ваш старый объект options
, и любые изменения в «новом» объекте newOptions
также изменили бы объект options
.
Однако, если вы хотите получить точно такой же объект и изменить его, не затрагивая другой, вы должны клонировать его. Вы можете добиться этого в JavaScript с помощью метода Object.create()
. Вы можете прочитать больше об этом здесь .
Таким образом, весь ваш код будет выглядеть так:
var options = {x: 10}
console.log(options.x + ' original options object');
cat(options);
function cat(options) {
newOptions = Object.create(options);
newOptions.x = 3;
x = newOptions.x;
console.log(x + ' cat = 3'); // this should equal 3
mouse(x);
}
dog(options);
function dog(options) {
newOptions = Object.create(options);
newOptions.x = 7;
x = newOptions.x;
console.log(x + ' dog = 7'); // this should equal 7
mouse(x);
}
// SHARED FUNCTION
function mouse(x) {
console.log(x + ' mouse = cat() and/or dog()'); // I want this to equal 3 for cat() and 7 for dog() just as it is with x defined inside cat() and dog().
}
console.log(options.x + ' final global scope check = 10'); // I want this to remain 10, not 3. But the changes in cat() are poluting the global definition of options.x.