zoukankan      html  css  js  c++  java
  • 编写自定义控件界面

    既然是控件,就应该有界面,默认生成的控件类只是一个继承了QWidget的类,如下:

    [cpp] view plaincopy
     
    1. #ifndef LOGLATEDIT_H  
    2. #define LOGLATEDIT_H  
    3.   
    4. #include <QWidget>  
    5.   
    6. class LogLatEdit : public QWidget  
    7. {  
    8.     Q_OBJECT  
    9. public:  
    10.     LogLatEdit(QWidget *parent = 0);  
    11. };  
    12.   
    13. #endif  
           我们需要的是如下的控件组合:

           该控件在输入浮点型模式下,是上面那样,直接输入以度为单位的浮点数即可,如果经纬度信息不是以度为单位的,此时自己换算的话非常麻烦,因此可以切换为度分秒的输入模式,也就是下面哪种样子。为此,我们需要添加一个LineEidt,两个SpinBox和一个DoubleSpinBox以及一些Label控件。

    为了简单起见,我不想自己手动去写这些界面相关的代码,为此我们可以先删掉默认生成的loglatedit.h和loglatedit.cpp文件,这样我们就可以重新使用LogLatEdit这个名称重新新建一个ui类了。右键工程,选择“添加新文件”,使用Qt下的“Qt设计师界面类”模板,创建一个ui类,如下图所示:

           这个界面类,我们重新命名为我们需要的控件名称LogLatEdit,之后编辑ui文件,调整QWidget的大小,然后绘制控件,如图:


           这里使用了HorizontalLayout控件对控件组合进行分组,为了演示方便,此处将二者拖放开来,最终的控件,实际上是两个水平布局叠加在一起,每次只有一个控件组合可见。

           当然另一个做法也是可行的,那就是不要删除最初默认生成的loglatedit文件,而是把这个新建的ui类命名为别的名字,比如test,在绘制好控件之后,编译一下,然后找到Moc生成的ui_test.h文件,打开该文件,我们把相应的代码拷贝到我们的LogLatEdit控件类中去,然后做适当的修改,比如设定两个控件组合的位置及可见性,以及控件容器QWidget的大小等。这里为了把所有相关的代码都放在一起,便于读者测试,使用的就是这种方式。

           使用ui类的方式比较方便,所有与界面相关的处理都可以在窗体设计器中完成,并且界面与代码分离,这种代码管理模式逻辑清晰,便于管理。不过使用ui类时,如果我们的ui类名称不是默认的LogLatEdit,则需要修改一下插件类中创建插件的代码,主要是修改loglateditplugin.cpp文件里createWidget方法中返回的控件对象。

           经过修改之后我们的经纬度控件的代码如下:
    [cpp] view plaincopy
     
    1. #ifndef LOGLATEDIT_H  
    2. #define LOGLATEDIT_H  
    3.   
    4. #include <QWidget>  
    5. #include <QtCore/QVariant>  
    6. #include <QtGui/QAction>  
    7. #include <QtGui/QApplication>  
    8. #include <QtGui/QButtonGroup>  
    9. #include <QtGui/QDoubleSpinBox>  
    10. #include <QtGui/QHBoxLayout>  
    11. #include <QtGui/QHeaderView>  
    12. #include <QtGui/QLabel>  
    13. #include <QtGui/QLineEdit>  
    14. #include <QtGui/QSpacerItem>  
    15. #include <QtGui/QSpinBox>  
    16. #include <QtGui/QWidget>  
    17.   
    18. class LogLatEdit : public QWidget  
    19. {  
    20.     Q_OBJECT  
    21. public:  
    22.     LogLatEdit(QWidget *parent = 0);  
    23.   
    24. private:  
    25.     QWidget *horizontalLayoutWidget;  
    26.     QHBoxLayout *horizontalLayout;  
    27.     QSpinBox *spinBox;  
    28.     QLabel *label_7;  
    29.     QSpinBox *spinBox_2;  
    30.     QLabel *label_8;  
    31.     QDoubleSpinBox *doubleSpinBox;  
    32.     QLabel *label_9;  
    33.     QWidget *horizontalLayoutWidget_2;  
    34.     QHBoxLayout *horizontalLayout_2;  
    35.     QLineEdit *lineEdit;  
    36.     QLabel *label_6;  
    37.     QSpacerItem *horizontalSpacer;  
    38.     QSpacerItem *horizontalSpacer_2;  
    39.   
    40. };  
    41.   
    42. #endif  
    源文件:
    [cpp] view plaincopy
     
    1. #include "loglatedit.h"  
    2.   
    3. LogLatEdit::LogLatEdit(QWidget *parent) :  
    4.     QWidget(parent)  
    5. {  
    6.     this->resize(160, 22);  
    7.     this->setMinimumSize(QSize(160,22)); //限定控件的大小  
    8.     this->setMaximumSize(QSize(200,22));  
    9.     horizontalLayoutWidget = new QWidget(this);  
    10.     horizontalLayoutWidget->setObjectName(QString::fromUtf8("horizontalLayoutWidget"));  
    11.     horizontalLayoutWidget->setGeometry(QRect(0, 0, 160, 22));  
    12.     horizontalLayout = new QHBoxLayout(horizontalLayoutWidget);  
    13.     horizontalLayout->setSpacing(1);  
    14.     horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));  
    15.     horizontalLayout->setContentsMargins(0, 0, 0, 0);  
    16.     spinBox = new QSpinBox(horizontalLayoutWidget);  
    17.     spinBox->setObjectName(QString::fromUtf8("spinBox"));  
    18.     spinBox->setMinimumSize(QSize(35, 20));  
    19.     spinBox->setMaximumSize(QSize(35, 20));  
    20.     spinBox->setMaximum(90);  
    21.   
    22.     horizontalLayout->addWidget(spinBox);  
    23.   
    24.     label_7 = new QLabel(horizontalLayoutWidget);  
    25.     label_7->setObjectName(QString::fromUtf8("label_7"));  
    26.     QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);  
    27.     sizePolicy.setHorizontalStretch(0);  
    28.     sizePolicy.setVerticalStretch(0);  
    29.     sizePolicy.setHeightForWidth(label_7->sizePolicy().hasHeightForWidth());  
    30.     label_7->setSizePolicy(sizePolicy);  
    31.     label_7->setMinimumSize(QSize(3, 20));  
    32.     label_7->setSizeIncrement(QSize(1, 0));  
    33.   
    34.     horizontalLayout->addWidget(label_7);  
    35.   
    36.     horizontalSpacer = new QSpacerItem(0, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);  
    37.   
    38.     horizontalLayout->addItem(horizontalSpacer);  
    39.   
    40.     spinBox_2 = new QSpinBox(horizontalLayoutWidget);  
    41.     spinBox_2->setObjectName(QString::fromUtf8("spinBox_2"));  
    42.     spinBox_2->setMinimumSize(QSize(35, 20));  
    43.     spinBox_2->setMaximumSize(QSize(35, 20));  
    44.     spinBox_2->setMaximum(90);  
    45.   
    46.     horizontalLayout->addWidget(spinBox_2);  
    47.   
    48.     label_8 = new QLabel(horizontalLayoutWidget);  
    49.     label_8->setObjectName(QString::fromUtf8("label_8"));  
    50.     sizePolicy.setHeightForWidth(label_8->sizePolicy().hasHeightForWidth());  
    51.     label_8->setSizePolicy(sizePolicy);  
    52.     label_8->setMinimumSize(QSize(3, 20));  
    53.     label_8->setSizeIncrement(QSize(1, 0));  
    54.   
    55.     horizontalLayout->addWidget(label_8);  
    56.   
    57.     horizontalSpacer_2 = new QSpacerItem(0, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);  
    58.   
    59.     horizontalLayout->addItem(horizontalSpacer_2);  
    60.   
    61.     doubleSpinBox = new QDoubleSpinBox(horizontalLayoutWidget);  
    62.     doubleSpinBox->setObjectName(QString::fromUtf8("doubleSpinBox"));  
    63.     doubleSpinBox->setMinimumSize(QSize(66, 20));  
    64.     doubleSpinBox->setMaximumSize(QSize(66, 20));  
    65.     doubleSpinBox->setDecimals(4);  
    66.     doubleSpinBox->setMaximum(90);  
    67.   
    68.     horizontalLayout->addWidget(doubleSpinBox);  
    69.   
    70.     label_9 = new QLabel(horizontalLayoutWidget);  
    71.     label_9->setObjectName(QString::fromUtf8("label_9"));  
    72.     sizePolicy.setHeightForWidth(label_9->sizePolicy().hasHeightForWidth());  
    73.     label_9->setSizePolicy(sizePolicy);  
    74.     label_9->setMinimumSize(QSize(3, 20));  
    75.     label_9->setSizeIncrement(QSize(1, 0));  
    76.   
    77.     horizontalLayout->addWidget(label_9);  
    78.   
    79.     horizontalLayoutWidget_2 = new QWidget(this);  
    80.     horizontalLayoutWidget_2->setObjectName(QString::fromUtf8("horizontalLayoutWidget_2"));  
    81.     horizontalLayoutWidget_2->setGeometry(QRect(0, 0, 160, 22));  
    82.     horizontalLayout_2 = new QHBoxLayout(horizontalLayoutWidget_2);  
    83.     horizontalLayout_2->setSpacing(1);  
    84.     horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));  
    85.     horizontalLayout_2->setContentsMargins(0, 0, 0, 0);  
    86.     lineEdit = new QLineEdit(horizontalLayoutWidget_2);  
    87.     lineEdit->setObjectName(QString::fromUtf8("lineEdit"));  
    88.     lineEdit->setInputMethodHints(Qt::ImhDigitsOnly|Qt::ImhFormattedNumbersOnly);  
    89.   
    90.     horizontalLayout_2->addWidget(lineEdit);  
    91.   
    92.     label_6 = new QLabel(horizontalLayoutWidget_2);  
    93.     label_6->setObjectName(QString::fromUtf8("label_6"));  
    94.   
    95.     horizontalLayout_2->addWidget(label_6);  
    96.   
    97.     label_7->setText(QApplication::translate("LogLatEdit", "302260", 0, QApplication::UnicodeUTF8));  
    98.     label_8->setText(QApplication::translate("LogLatEdit", "342200262", 0, QApplication::UnicodeUTF8));  
    99.     label_9->setText(QApplication::translate("LogLatEdit", "342200263", 0, QApplication::UnicodeUTF8));  
    100.     label_6->setText(QApplication::translate("LogLatEdit", "302260", 0, QApplication::UnicodeUTF8));  
    101.   
    102.     horizontalLayoutWidget_2->setVisible(false);  
    103.     QMetaObject::connectSlotsByName(this);  
    104.   
    105. }  

           至此,界面相关的事情就做完了,后面我们需要给这个控件添加两个属性,一个输入模式属性,更改这个属性时,我们的控件可以在两种输入模式下切换,另一个属性就是经纬度值,我们要使其可以设置和返回经纬度值。

  • 相关阅读:
    零知识证明 SNARKs 第2部分:多项式盲估
    零知识证明 SNARKs 第3部分:知识系数测试和假设
    零知识证明 SNARKs 第4部分:如何进行可验证多项式盲估
    网站渗透测试原理及详细过程
    网站渗透测试原理及详细过程
    网站渗透测试原理及详细过程
    网站渗透测试原理及详细过程
    Java网络编程从入门到精通(27):关闭服务端连接
    Java网络编程从入门到精通(27):关闭服务端连接
    Java网络编程从入门到精通(27):关闭服务端连接
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/5105397.html
Copyright © 2011-2022 走看看