给自定义控件添加属性

  窗体控件都有属性,比如QLineEdit就有text属性,另外还有设置属性,比如QLineEdit的readOnly属性。下面就讲解一下如何给自己的控件添加属性的问题。对于我们的经纬度输入控件,它应该具有一个设置属性和一个值属性,我们把设置属性命名为inputMode,把值属性命名为value,先来讲解设置属性inputMode。

       对于inputMode属性,它应该是一个枚举值,分别对应控件的两种状态,即浮点输入模式和经纬度输入模式,因此这个类型应该定义为枚举型。另外对于Qt的控件类,如何声明属性,我们可以参考Qt的源代码,比如D:Qt4.8.4srcguiwidgets目录下QMainWindow的定义,我们可以仿照其做法,实现输入模式属性,这里不多做解释,直接给出代码:

[cpp] view plaincopy
 
  1. class LogLatEdit : public QWidget  
  2. {  
  3.     Q_OBJECT  
  4.   
  5.     Q_ENUMS(InputMode)  
  6.     Q_PROPERTY(InputMode inputMode READ inputMode WRITE setInputMode)  
  7.     Q_PROPERTY(float value READ value WRITE setValue)  
  8. public:  
  9.     LogLatEdit(QWidget *parent = 0);  
  10.   
  11.     enum InputMode  
  12.     {  
  13.         Float,      //float number mode  
  14.         DegSecMin   //Degree second minute mode  
  15.     };  
  16.     InputMode inputMode()const;  
  17. void setInputMode(const InputMode mode);  
  18.   
  19.     double value() const;  
  20. void setValue(const double val);  
  21.     //其余略  
  22. };  
       仿照QMainWindow的DockOptions属性和iconSize属性,我们实现我们的inputMode属性和value属性。这里注意一下使用Q_PROPERTY宏声明属性的方法,用法很简单,不多解释。下面是对应属性的实现代码:
[cpp] view plaincopy
 
  1. LogLatEdit::InputMode LogLatEdit::inputMode() const  
  2. {  
  3.     return m_Mode;  
  4. }  
  5.   
  6.   
  7. void LogLatEdit::setInputMode(const InputMode mode)  
  8. {      
  9.     double val = this->value();  
  10.     if(mode==DegSecMin)  
  11.     {  
  12.         horizontalLayoutWidget->setVisible(true);  
  13.         horizontalLayoutWidget_2->setVisible(false);  
  14.     }  
  15.     else  
  16.     {  
  17.         horizontalLayoutWidget->setVisible(false);  
  18.         horizontalLayoutWidget_2->setVisible(true);  
  19.     }  
  20.     m_Mode = mode;  
  21.     this->setValue(val);  
  22. }  
  23.   
  24.   
  25. double LogLatEdit::value() const  
  26. {  
  27.     if(this->inputMode()==Float)  
  28.     {  
  29.         return this->lineEdit->text().toDouble();  
  30.     }  
  31.     else  
  32.     {  
  33.         double val = 0;  
  34.         val = this->spinBox->value() +  
  35.                 double(this->spinBox_2->value())/60.0 +  
  36.                 this->doubleSpinBox->value()/3600.0;  
  37.         return val;  
  38.     }  
  39. }  
  40.   
  41. void LogLatEdit::setValue(const double val)  
  42. {  
  43.     m_Value = val;  
  44.     if(this->inputMode()==Float)  
  45.     {  
  46.         this->lineEdit->setText(tr("%1").arg(val));  
  47.     }  
  48.     else  
  49.     {  
  50.         this->spinBox->setValue(int(val));  
  51.         this->spinBox_2->setValue(int((val-int(val))*60));  
  52.         this->doubleSpinBox->setValue(((val-int(val))*60-int((val-int(val))*60)));  
  53.     }  
  54. }  
原文地址:https://www.cnblogs.com/lvdongjie/p/5105393.html