给自定义控件添加属性
窗体控件都有属性,比如QLineEdit就有text属性,另外还有设置属性,比如QLineEdit的readOnly属性。下面就讲解一下如何给自己的控件添加属性的问题。对于我们的经纬度输入控件,它应该具有一个设置属性和一个值属性,我们把设置属性命名为inputMode,把值属性命名为value,先来讲解设置属性inputMode。
对于inputMode属性,它应该是一个枚举值,分别对应控件的两种状态,即浮点输入模式和经纬度输入模式,因此这个类型应该定义为枚举型。另外对于Qt的控件类,如何声明属性,我们可以参考Qt的源代码,比如D:\Qt\4.8.4\src\gui\widgets目录下QMainWindow的定义,我们可以仿照其做法,实现输入模式属性,这里不多做解释,直接给出代码:
- 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);
- //其余略
- };
- 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)));
- }
- }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2015-01-06 shell 脚本实现的守护进程
2015-01-06 Linux crontab 命令详解(含配置文件路径)
2015-01-06 shell 中条件判断
2015-01-06 LINUX nohup命令输入输出深浅进出
2015-01-06 Linux命令后台运行