【问题标题】:Resetting Qt Style Sheet重置 Qt 样式表
【发布时间】:2010-06-16 11:14:49
【问题描述】:

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

【问题讨论】:

    标签: qt stylesheet signals-slots


    【解决方案1】:

    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!

    【讨论】:

    • 检查limitations,您可能还需要使用.update()
    【解决方案2】:

    好吧,这不是编译,但原则上应该可以,你应该可以通过调用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>"]
    

    将样式表的应用限制为&lt;property&gt; 具有适当&lt;value&gt; 的类的实例,唯一需要注意的是,当属性更改其值时,样式不会更改,因此必须重新应用样式表才能真正改变小部件的外观,请参阅Stylesheet Documentation -> Property Selector

    这种结构将样式表移动到使用它的小部件中,并在小部件内部进行切换,小部件根据其状态进行更改。

    一般来说,您有几种方法可以处理表单中的无效输入

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

    b)在您上面描述的提交循环中执行此操作,每当用户单击提交时,都会更改正确和不正确字段的状态

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

    【讨论】:

      【解决方案3】:

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

      这里是预设的here按钮,对你的行编辑进行同样的操作

      【讨论】:

      • 我在自定义 QLineEdit 时没有任何问题,但我在使用不同类中的另一个函数重置它时遇到了问题。
      • 你能写一个快速的示例类并发布代码吗?您编写两个类并告诉您在哪种情况下遇到问题,这将很容易跟踪和找到解决方案。我没有得到,你到底想要什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 2017-05-28
      • 1970-01-01
      • 2011-05-25
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多