Сброс Таблицы Стилей Qt
Мне удалось сделать стиль моего QLineEdit примерно таким:
Alt текст http://www.kimag.es/share/54278758.png
void Utilities::setFormErrorStyle(QLineEdit *lineEdit)
{
lineEdit->setStyleSheet(
"background-color: #FF8A8A;"
"background-image: url(:/resources/warning.png);"
"background-position: right center;"
"background-repeat: no-repeat;"
"");
}
Я вызвал функцию, используя
Utilities *util = new Utilities;
util->setFormErrorStyle(lineNoStaf);
Поток должен быть примерно таким:
- открытая форма пользователя
- данные заполнения пользователем
- пользователь отправляет данные
- получил ошибку
- использовать
setFormErrorStyle()
- пользователь редактирует текст в QLineEdit и стиль исчезает
Эта функция должен быть повторно использован снова и снова, но как я могу подключить qlineedit сигнал, такой как textChanged() к функции в другом классе, которая сбросит таблицу стилей, а затем отключит сигнал, чтобы он не работал непрерывно каждый раз, когда текст изменяется ?
3 ответов:
Ладно, это не компиляция, но должно работать в принципе, вы должны быть в состоянии изменить внешний вид, вызвав
editWidget->setProperty('isError',true)илиeditWidget->setError(false)class ErrorTextEdit : QLineEdit { Q_OBJECT QPROPERTY(bool isError, READ isError, WRITE setError); public: ErrorTextEdit(QWidget* parent) : QLineEdit(parent), m_isError(false) { m_styleSheet = "" // see below setStyleSheet(m_styleSheet); } void setError(bool val) { if (val != m_isError) { m_isError = val; setStyleSheet(m_styleSheet); } } bool isError() {return m_isError;} private: QString m_styleSheet; bool m_isError; }Для таблицы стилей
ErrorTextEdit[isError="false"] { optional ... Style for textedit that is NOT an error } ErrorTextEdit[isError="true"] { background-color: #FF8A8A; background-image: url(:/resources/warning.png); background-position: right center; background-repeat: no-repeat; }Термин
[<property>="<value>"]Ограничивает применение таблицы стилей к экземплярам класса, у которого
Эта конструкция перемещает таблицу стилей в виджет, который ее использует, и делает переключатель внутренним для виджета, виджет изменяется в соответствии с его состоянием.<property>есть соответствующий<value>единственный нюанс заключается в том, что стиль не изменяется, когда свойство изменяет свое ' значение, поэтому таблица стилей должна быть повторно применена для внешнего вида виджета на самом деле. изменить, см. документация по таблице стилей - > селектор свойствВ общем случае у вас есть несколько способов обработки недопустимых входных данных в вашей форме
A) наблюдайте за каждым изменением и обновляйте стиль соответствующим образом, вы должны быть в состоянии использовать
QValidatorдля этого тоже, но это отдельная тема, используя QValidator вы, вероятно, сможете полностью интернализовать состояние одного QTextEdit и не придется иметь дело с его валидностью извнеB) сделайте это в цикле submit, который вы описали выше, всякий раз, когда пользователь нажимает на submit, измените состояние правильных и неправильных полей
Все зависит от структуры вашего приложения и вида
Qt также допускает динамические свойства в своей таблице стилей, что означает, что вам не нужно кодировать свой собственный класс для каждого типа виджета в вашей форме.
Из http://qt-project.org/doc/qt-4.8/stylesheet-examples.html
Настройка С Использованием Динамических Свойств
Есть много ситуаций, когда нам нужно представить форму, которая имеет обязательные поля. Чтобы указать пользователю, что поле является обязательным, одним из эффективных (хотя и эстетически сомнительных) решений является: используйте желтый цвет в качестве фона для этих полей. Оказывается, это очень легко реализовать с помощью таблиц стилей Qt. Во-первых, мы будем использовать следующую таблицу стилей для всего приложения:*[mandatoryField="true"] { background-color: yellow }Это означает, что каждый виджет, свойство Qt mandatoryField которого имеет значение true, будет иметь желтый фон. Затем для каждого виджета обязательных полей мы просто создадим свойство mandatoryField на лету и установим его в true. Например:
QLineEdit *nameEdit = new QLineEdit(this); nameEdit->setProperty("mandatoryField", true); QLineEdit *emailEdit = new QLineEdit(this); emailEdit->setProperty("mandatoryField", true); QSpinBox *ageSpinBox = new QSpinBox(this); ageSpinBox->setProperty("mandatoryField", true);Работает также в Qt 4.3!
Видите ли, другая идея заключается в том, что вам нужно переопределить paint evet line edit, а затем установить фоновое изображение и цвет.
Здесь имплиментация presetn здесь кнопка, следуйте тому же к вашей строке edit
Comments