2010-06-16 49 views
2

我已经成功地我QLineEdit的风格是这样的:重置Qt样式表

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

还好吧,这不是编译,但原则上应工作,你应该能够通过调用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>唯一需要注意的就是风格是当地产改变其价值改变的类的实例,所以样式表必须是请重新应用该窗口小部件的外观以实际更改,请参见Stylesheet Documentation -> Property Selector

此构造将样式表移至使用它的窗口小部件中,并将开关置于窗口小部件内部,窗口小部件将根据其状态进行更改。

一般来说,你有一对夫妇的方式在你的形式来处理无效输入

一)观察每一个变化,并适当地更新款式,你应该能够使用QValidator为过,但是这是一个独立的主题,使用QValidator,您可能完全内部化一个QTextEdit的状态,而不必处理来自外部的有效性。

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

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

0

看到,另一个想法是你需要重写线编辑的画笔,然后设置背景图像和颜色。

这里的执行力度是presetn here按钮,跟进同你行编辑

+0

我在自定义'QLineEdit'时没有任何问题,但是我有问题使用另一个类中的另一个函数重新设置它。 – amree 2010-06-16 13:15:27

+0

你能写一个快速样本类并发布代码吗? 你写这两门课,并告诉你在哪个场景中你面临的问题,这将是很容易跟踪和找到解决方案。 我没有得到,你想要多少。 – Naruto 2010-06-16 13:51:49

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!