Сброс Таблицы Стилей 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);


Поток должен быть примерно таким:




  1. открытая форма пользователя

  2. данные заполнения пользователем

  3. пользователь отправляет данные

  4. получил ошибку

  5. использовать setFormErrorStyle()

  6. пользователь редактирует текст в QLineEdit и стиль исчезает


Эта функция должен быть повторно использован снова и снова, но как я могу подключить qlineedit сигнал, такой как textChanged() к функции в другом классе, которая сбросит таблицу стилей, а затем отключит сигнал, чтобы он не работал непрерывно каждый раз, когда текст изменяется ?

790   3  

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

    Ничего не найдено.