3

我设法将我的 QLineEdit 样式设置为如下所示:

替代文字 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()到其他类中的函数,该函数将重置样式表然后断开信号,这样每次文本更改时它就不会连续运行?

4

3 回答 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!

于 2014-02-17T13:40:42.497 回答
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)在您上面描述的提交循环中执行此操作,每当用户单击提交时,都会更改正确和不正确字段的状态

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

于 2010-06-16T20:05:45.543 回答
0

看,另一个想法是您需要覆盖行编辑的绘制事件,然后设置背景图像和颜色。

这里的实施是在此处预设的 按钮,对您的行编辑进行相同的操作

于 2010-06-16T11:49:33.553 回答