Сброс таблицы стилей Qt - PullRequest
2 голосов
/ 16 июня 2010

Мне удалось стилизовать мой QLineEdit примерно так:

alt text 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(), к функции из другого класса, которая будет сбрасывать таблицу стилей, а затем отключать сигнал, чтобы он не работал непрерывно при каждом изменении текста?

Ответы [ 3 ]

5 голосов
/ 17 февраля 2014

Qt также разрешает динамические свойства в своей таблице стилей, что означает, что вам не нужно кодировать свой собственный класс для каждого типа виджетов в вашей форме.

С http://qt -project.org / doc / qt-4.8 / stylesheet-examples.html

Настройка с использованием динамических свойств

Есть много ситуаций, когда нам нужно представить форму с обязательными полями. Чтобы указать пользователю, что поле является обязательным, одним эффективным (хотя и эстетически сомнительным) решением является использование желтого цвета в качестве фона для этих полей. Оказывается, это очень легко реализовать с помощью таблиц стилей Qt. Во-первых, мы будем использовать следующую таблицу стилей для всего приложения:

 *[mandatoryField="true"] { background-color: yellow }

Это означает, что у каждого виджета, для свойства QT которого установлено значение true, будет желтый фон. Затем для каждого виджета обязательного поля мы просто на лету создаем свойство requiredField и устанавливаем для него значение 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!

3 голосов
/ 17 июня 2010

Хорошо, это не скомпилировано, но должно работать в принципе, вы можете изменить внешний вид, позвонив по номеру 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) Делайте это в цикле отправки, который вы описали выше, всякий раз, когда пользователь нажимает на кнопку отправки, изменяет состояние правильных и неправильных полей

все зависит от структуры вашего приложения и вида

0 голосов
/ 16 июня 2010

Видите, другая идея заключается в том, что вам нужно переопределить цвет краски при редактировании линии, а затем установить фоновое изображение и цвет.

здесь предустановка здесь кнопкато же самое в вашей строке edit

...