Самое простое решение:
Вместо использования:
var funcs = [];
for(var i =0; i<3; i++){
funcs[i] = function(){
alert(i);
}
}
for(var j =0; j<3; j++){
funcs[j]();
}
, который предупреждает «2», в 3 раза. Это связано с тем, что анонимные функции, созданные в цикле for, имеют одно и то же закрытие, а в этом закрытии значение i
одинаково. Используйте это, чтобы предотвратить совместное закрытие:
var funcs = [];
for(var new_i =0; new_i<3; new_i++){
(function(i){
funcs[i] = function(){
alert(i);
}
})(new_i);
}
for(var j =0; j<3; j++){
funcs[j]();
}
Идея этого заключается в том, что инкапсуляция всего тела цикла for с помощью IIFE (выражение с выражением немедленного вызова) и передача new_i
в качестве параметра и зафиксировать его как i
. Поскольку анонимная функция выполняется немедленно, значение i
отличается для каждой функции, определенной внутри анонимной функции.
Это решение похоже на любую проблему, так как оно потребует минимальных изменений в исходном коде, страдающем из этого вопроса. Фактически, это по дизайну, это не должно быть проблемой вообще!
Чтобы загрузить значения из Qt Stylesheet, вы должны вызвать следующие методы:
widget->style()->unpolish(widget);
widget->style()->polish(widget);
widget->update();
После этого все значения вашего виджета будут обновляться в соответствии с указанными вами значениями стилей.
Вы можете получить шрифт определенного виджета, считывающего его свойства, как показано ниже:
//Get pushbutton font.
QFont font = ui->pushButton->property("font").value<QFont>();
qDebug() << font.family() << font.pointSize();
//Get MainWindow font.
QFont font2 = property("font").value<QFont>();
qDebug() << font2.family() << font2.pointSize();
Лучшее, что я могу сказать из QStyleSheetStyle :: updateStyleSheetFont , виджет всегда содержит разрешенный шрифт из таблицы стилей. Я ожидаю, что QWidget::font()
вернет разрешенный шрифт, который вы установили, используя таблицу стилей - то есть шрифт, который является объединенным шрифтом приложения, шрифтами любого родительского виджета и шрифтом стилей.
Виджет сначала нужно отполировать, если вы не запрашиваете после того, как события были доставлены (т. е. из цикла событий).
// https://github.com/KubaO/stackoverflown/tree/master/questions/style-font-query-test-45422885
#include <QtWidgets>
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QLabel label("Test");
auto font1 = label.font();
label.setStyleSheet("font-size: 49pt;");
label.show();
label.ensurePolished();
auto font2 = label.font();
Q_ASSERT(font1.pointSize() != 49);
Q_ASSERT(font2.pointSize() == 49);
Q_ASSERT(font1.family() == font2.family());
}