重置Qt样式表

时间:2010-06-16 11:14:50

标签: qt stylesheet signals-slots

我设法将我的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 中的文字,样式消失
  7. 此功能应该可以一遍又一遍地重复使用,但是如何将{strong> QLineEdit 信号(例如textChanged())连接到将重置样式表的其他类中的函数,然后断开连接信号,以便每次文本更改时都不会连续运行?

3 个答案:

答案 0 :(得分:5)

Qt还允许在其样式表中使用动态属性,这意味着您不需要为表单中的每个窗口小部件类型编写自己的类。

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

使用动态属性进行自定义

在许多情况下,我们需要提供具有必填字段的表单。为了向用户指示该字段是强制性的,一种有效的(尽管是美学上可疑的)解决方案是使用黄色作为那些字段的背景颜色。事实证明,使用Qt样式表很容易实现。首先,我们将使用以下应用程序范围的样式表:

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

这意味着其mandatoryField Qt属性设置为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中使用!

答案 1 :(得分: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>的类的实例,唯一需要注意的是,当属性更改其时,样式已更改'value,因此必须重新应用样式表才能使窗口小部件的外观真正发生变化,请参阅Stylesheet Documentation -> Property Selector

此构造将样式表移动到使用它的窗口小部件中,并使得切换器内部部署到窗口小部件,窗口小部件根据其状态进行更改。

通常,您可以通过多种方式处理表单中的无效输入

a)观察每个更改并适当更新样式,你也应该能够使用QValidator,但这是一个单独的主题,使用QValidator你可能能够完全内化一个状态单个QTextEdit而不必从外部处理其有效性

b)在上面提到的提交循环中执行此操作,每当用户点击提交时更改正确和错误字段的状态

这一切都取决于您的应用程序和视图的结构

答案 2 :(得分:0)

看,另一个想法是你需要覆盖线条编辑的油漆,然后设置背景图像和颜色。

这里的implimentation是预置here按钮,跟你的行编辑一样