zoukankan      html  css  js  c++  java
  • 给自定义控件添加属性

      窗体控件都有属性,比如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. }  
  • 相关阅读:
    groovy-搭建环境
    isAssignableFrom
    H5调用摄像头
    php生成唯一id
    剑指Offer刷题日常
    ASCII码对照表
    用redis stream作队列的一些心得
    在 CAP 中使用 AOP ( Castle.DynamicProxy )
    office2019下载
    JVM调优浅谈
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/5105393.html
Copyright © 2011-2022 走看看