博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
给自定义控件添加属性
阅读量:4922 次
发布时间:2019-06-11

本文共 1933 字,大约阅读时间需要 6 分钟。

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

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

[cpp] 
 
  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] 
 
  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

你可能感兴趣的文章
linux内核分析程序破解实践报告
查看>>
python datetime 操作相关
查看>>
2019-06-18 今日头条面试题。 合理设计这两个类。 2。 student 继承person 3 不能使用class...
查看>>
网络构建入门技术(5)——子网划分应用
查看>>
OpenCV学习笔记——滑动条开关
查看>>
memcpy函数、memset()函数、strcpy函数、strncpy函数、strcmp函数
查看>>
完成个人中心—导航标签
查看>>
理解OAuth 2.0
查看>>
XML学习笔记1——概述
查看>>
unity3d游戏开发——新手引导
查看>>
unity3d游戏开发 —— 倒计时
查看>>
modelform save
查看>>
吴裕雄 python oracle操作数据库(4)
查看>>
吴裕雄--天生自然 PHP开发学习:MySQL 插入多条数据
查看>>
吴裕雄--天生自然 JAVA开发学习:Character 类
查看>>
jsp中page 设置 isErrorPage=true后,请求转发进这个页面会报HTTP 500
查看>>
让Xcode 8.x能够调试iOS 7.x真机
查看>>
hdu 1849Rabbit and Grass(博弈论 一维nim游戏)
查看>>
java抽象类?(抄袭)
查看>>
UVa 202 - Repeating Decimals
查看>>