给自定义控件添加属性
2016-01-06 14:12
337 查看
窗体控件都有属性,比如QLineEdit就有text属性,另外还有设置属性,比如QLineEdit的readOnly属性。下面就讲解一下如何给自己的控件添加属性的问题。对于我们的经纬度输入控件,它应该具有一个设置属性和一个值属性,我们把设置属性命名为inputMode,把值属性命名为value,先来讲解设置属性inputMode。
对于inputMode属性,它应该是一个枚举值,分别对应控件的两种状态,即浮点输入模式和经纬度输入模式,因此这个类型应该定义为枚举型。另外对于Qt的控件类,如何声明属性,我们可以参考Qt的源代码,比如D:\Qt\4.8.4\src\gui\widgets目录下QMainWindow的定义,我们可以仿照其做法,实现输入模式属性,这里不多做解释,直接给出代码:[cpp] view plaincopy
class LogLatEdit : public QWidget
{
Q_OBJECT
Q_ENUMS(InputMode)
Q_PROPERTY(InputMode inputMode READ inputMode WRITE setInputMode)
Q_PROPERTY(float value READ value WRITE setValue)
public:
LogLatEdit(QWidget *parent = 0);
enum InputMode
{
Float, //float number mode
DegSecMin //Degree second minute mode
};
InputMode inputMode()const;
void setInputMode(const InputMode mode);
double value() const;
void setValue(const double val);
//其余略
};
仿照QMainWindow的DockOptions属性和iconSize属性,我们实现我们的inputMode属性和value属性。这里注意一下使用Q_PROPERTY宏声明属性的方法,用法很简单,不多解释。下面是对应属性的实现代码:
[cpp] view plaincopy
LogLatEdit::InputMode LogLatEdit::inputMode() const
{
return m_Mode;
}
void LogLatEdit::setInputMode(const InputMode mode)
{
double val = this->value();
if(mode==DegSecMin)
{
horizontalLayoutWidget->setVisible(true);
horizontalLayoutWidget_2->setVisible(false);
}
else
{
horizontalLayoutWidget->setVisible(false);
horizontalLayoutWidget_2->setVisible(true);
}
m_Mode = mode;
this->setValue(val);
}
double LogLatEdit::value() const
{
if(this->inputMode()==Float)
{
return this->lineEdit->text().toDouble();
}
else
{
double val = 0;
val = this->spinBox->value() +
double(this->spinBox_2->value())/60.0 +
this->doubleSpinBox->value()/3600.0;
return val;
}
}
void LogLatEdit::setValue(const double val)
{
m_Value = val;
if(this->inputMode()==Float)
{
this->lineEdit->setText(tr("%1").arg(val));
}
else
{
this->spinBox->setValue(int(val));
this->spinBox_2->setValue(int((val-int(val))*60));
this->doubleSpinBox->setValue(((val-int(val))*60-int((val-int(val))*60)));
}
}
相关文章推荐
- java读文件的几个类
- 简单使用Spring注解 测试程序 非web程序
- C++拷贝构造函数的三种情况
- IOS开发懒加载
- Linux中的双向循环链表
- 《nodejs开发指南》微博实例express4.x版
- POJO和javabean的异同
- 如何同时启动多个Tomcat服务器
- 1.1 如何配置Android的开发环境步骤
- BZOJ 3566: [SHOI2014]概率充电器
- [转]java.sql.SQLException: 无效的列索引
- Java中注解(Anotation)的使用
- android4.4+me909+电信4g卡
- Android开发基础教程 支持不同设备——支持不同(Android)平台版本
- codevs[1160] 蛇形矩阵
- 使用自定义控件
- Spring10种常见异常解决方法
- JS实现Tab切换
- java读取远程url图片,得到宽高
- Linux基础系列(四)系统用户和组管理