重置 Qt 样式表

3
我已经成功地将我的QLineEdit样式设置成了这样:

alt text http://www.kimag.es/share/54278758.png

(注:QLineEdit是一种Qt库中的用户界面控件,用于接收和显示单行文本输入。)
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个回答

6

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
请查看限制条件,您可能还需要使用.update() - JacksonPro

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)在上面描述的提交循环中执行此操作,每当用户单击提交时,更改正确和错误字段的状态。

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


0
看,另一个想法是你需要覆盖行编辑器的绘制事件,然后设置背景图像和颜色。
这里的实现已经在这里的按钮中展示了,按照相同的方式来处理你的行编辑器。

我在自定义QLineEdit方面没有任何问题,但是我在不同类中使用另一个函数将其重置时遇到了问题。 - Amree
你能写一个快速的示例类并发布代码吗?你可以写出两个类并告诉我在哪种情况下出现问题,这将更容易跟踪和找到解决方案。我不明白你想要什么。 - Naruto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接