编写Qt Designer自定义控件(三)——给自定义控件添加属性

接上文:编写Qt Designer自定义控件(二)——编写自定义控件界面

       窗体控件都有属性,比如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);
	//其余略
};
       仿照QMainWindow的DockOptions属性和iconSize属性,我们实现我们的inputMode属性和value属性。这里注意一下使用Q_PROPERTY宏声明属性的方法,用法很简单,不多解释。下面是对应属性的实现代码:

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)));
    }
}

未完,待续...


猜你喜欢

转载自blog.csdn.net/giselite/article/details/12622625