接上文:编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件

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

#ifndef LOGLATEDIT_H
#define LOGLATEDIT_H #include <QWidget> class LogLatEdit : public QWidget
{
Q_OBJECT
public:
LogLatEdit(QWidget *parent = 0);
}; #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方法中返回的控件对象。

经过修改之后我们的经纬度控件的代码如下:

#ifndef LOGLATEDIT_H
#define LOGLATEDIT_H #include <QWidget>
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDoubleSpinBox>
#include <QtGui/QHBoxLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QSpacerItem>
#include <QtGui/QSpinBox>
#include <QtGui/QWidget> class LogLatEdit : public QWidget
{
Q_OBJECT
public:
LogLatEdit(QWidget *parent = 0); private:
QWidget *horizontalLayoutWidget;
QHBoxLayout *horizontalLayout;
QSpinBox *spinBox;
QLabel *label_7;
QSpinBox *spinBox_2;
QLabel *label_8;
QDoubleSpinBox *doubleSpinBox;
QLabel *label_9;
QWidget *horizontalLayoutWidget_2;
QHBoxLayout *horizontalLayout_2;
QLineEdit *lineEdit;
QLabel *label_6;
QSpacerItem *horizontalSpacer;
QSpacerItem *horizontalSpacer_2; }; #endif

源文件:

#include "loglatedit.h"

LogLatEdit::LogLatEdit(QWidget *parent) :
QWidget(parent)
{
this->resize(160, 22);
this->setMinimumSize(QSize(160,22)); //限定控件的大小
this->setMaximumSize(QSize(200,22));
horizontalLayoutWidget = new QWidget(this);
horizontalLayoutWidget->setObjectName(QString::fromUtf8("horizontalLayoutWidget"));
horizontalLayoutWidget->setGeometry(QRect(0, 0, 160, 22));
horizontalLayout = new QHBoxLayout(horizontalLayoutWidget);
horizontalLayout->setSpacing(1);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
horizontalLayout->setContentsMargins(0, 0, 0, 0);
spinBox = new QSpinBox(horizontalLayoutWidget);
spinBox->setObjectName(QString::fromUtf8("spinBox"));
spinBox->setMinimumSize(QSize(35, 20));
spinBox->setMaximumSize(QSize(35, 20));
spinBox->setMaximum(90); horizontalLayout->addWidget(spinBox); label_7 = new QLabel(horizontalLayoutWidget);
label_7->setObjectName(QString::fromUtf8("label_7"));
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(0);
sizePolicy.setHeightForWidth(label_7->sizePolicy().hasHeightForWidth());
label_7->setSizePolicy(sizePolicy);
label_7->setMinimumSize(QSize(3, 20));
label_7->setSizeIncrement(QSize(1, 0)); horizontalLayout->addWidget(label_7); horizontalSpacer = new QSpacerItem(0, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout->addItem(horizontalSpacer); spinBox_2 = new QSpinBox(horizontalLayoutWidget);
spinBox_2->setObjectName(QString::fromUtf8("spinBox_2"));
spinBox_2->setMinimumSize(QSize(35, 20));
spinBox_2->setMaximumSize(QSize(35, 20));
spinBox_2->setMaximum(90); horizontalLayout->addWidget(spinBox_2); label_8 = new QLabel(horizontalLayoutWidget);
label_8->setObjectName(QString::fromUtf8("label_8"));
sizePolicy.setHeightForWidth(label_8->sizePolicy().hasHeightForWidth());
label_8->setSizePolicy(sizePolicy);
label_8->setMinimumSize(QSize(3, 20));
label_8->setSizeIncrement(QSize(1, 0)); horizontalLayout->addWidget(label_8); horizontalSpacer_2 = new QSpacerItem(0, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); horizontalLayout->addItem(horizontalSpacer_2); doubleSpinBox = new QDoubleSpinBox(horizontalLayoutWidget);
doubleSpinBox->setObjectName(QString::fromUtf8("doubleSpinBox"));
doubleSpinBox->setMinimumSize(QSize(66, 20));
doubleSpinBox->setMaximumSize(QSize(66, 20));
doubleSpinBox->setDecimals(4);
doubleSpinBox->setMaximum(90); horizontalLayout->addWidget(doubleSpinBox); label_9 = new QLabel(horizontalLayoutWidget);
label_9->setObjectName(QString::fromUtf8("label_9"));
sizePolicy.setHeightForWidth(label_9->sizePolicy().hasHeightForWidth());
label_9->setSizePolicy(sizePolicy);
label_9->setMinimumSize(QSize(3, 20));
label_9->setSizeIncrement(QSize(1, 0)); horizontalLayout->addWidget(label_9); horizontalLayoutWidget_2 = new QWidget(this);
horizontalLayoutWidget_2->setObjectName(QString::fromUtf8("horizontalLayoutWidget_2"));
horizontalLayoutWidget_2->setGeometry(QRect(0, 0, 160, 22));
horizontalLayout_2 = new QHBoxLayout(horizontalLayoutWidget_2);
horizontalLayout_2->setSpacing(1);
horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
horizontalLayout_2->setContentsMargins(0, 0, 0, 0);
lineEdit = new QLineEdit(horizontalLayoutWidget_2);
lineEdit->setObjectName(QString::fromUtf8("lineEdit"));
lineEdit->setInputMethodHints(Qt::ImhDigitsOnly|Qt::ImhFormattedNumbersOnly); horizontalLayout_2->addWidget(lineEdit); label_6 = new QLabel(horizontalLayoutWidget_2);
label_6->setObjectName(QString::fromUtf8("label_6")); horizontalLayout_2->addWidget(label_6); label_7->setText(QApplication::translate("LogLatEdit", "\302\260", 0, QApplication::UnicodeUTF8));
label_8->setText(QApplication::translate("LogLatEdit", "\342\200\262", 0, QApplication::UnicodeUTF8));
label_9->setText(QApplication::translate("LogLatEdit", "\342\200\263", 0, QApplication::UnicodeUTF8));
label_6->setText(QApplication::translate("LogLatEdit", "\302\260", 0, QApplication::UnicodeUTF8)); horizontalLayoutWidget_2->setVisible(false);
QMetaObject::connectSlotsByName(this); }

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

未完,待续...

编写Qt Designer自定义控件(二)——编写自定义控件界面的更多相关文章

  1. 编写Qt Designer自定义控件

    一)流程概述 在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满 ...

  2. 编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件

    在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...

  3. qt designer启动后不显示界面问题的原因与解决办法

    Qt 5.6.1无论是在vs里双击ui文件还是直接启动designer.exe都一直无法显示界面,但任务管理器中可以看到该进程是存在的.前几天还正常的,但昨天加了一块NVIDIA的显卡(机器自带核显) ...

  4. 把自定义控件集成到Qt Designer中

    要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion) ...

  5. 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...

  6. 自定义的插件如何加载到Qt Designer中(详细)

    要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion) ...

  7. [ PyQt入门教程 ] Qt Designer工具的使用

    Qt Designer是PyQt程序UI界面的实现工具,Qt Designer工具使用简单,可以通过拖拽和点击完成复杂界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用.本文 ...

  8. Qt编写自定义控件二动画按钮

    现在的web发展越来越快,很多流行的布局样式,都是从web开始的,写惯了Qt widgets 项目,很多时候想改进一下现有的人机交互,尤其是在现有的按钮上加一些动画的效果,例如鼠标移上去变大,移开还原 ...

  9. 利用Eric+Qt Designer编写倒计时时钟

    [前言]前几日通过编写命令行通讯录,掌握了Python的基本语法结构,于是开始向更高水平冲击,利用Eric与Qt Designer 编写一个带界面的小程序.本次实操中也确实遇到了不少问题,通过学习也都 ...

随机推荐

  1. MSSQLServer基础03(数据检索(查询))

    执行备注中的代码创建测试数据表. 简单的数据检索 :SELECT * FROM Student 只检索需要的列 :SELECT sName FROM Student .ame FROM Student ...

  2. 排查Java线上服务故障的方法和实例分析

    前言 作为在线系统负责人或者是一个技术专家,你可能刚刚接手一个项目就需要处理紧急故障,或者被要求帮忙处理一些紧急的故障,这个时候的情景是: (1)你可能对这个业务仅仅是听说过,而不怎么真正了解: (2 ...

  3. WinAPI——SetWindowsHookEx设置钩子说明

    提示: 如果要设置系统级钩子, 钩子函数必须在 DLL 中. SetWindowsHookEx(   idHook: Integer;  {钩子类型}   lpfn: TFNHookProc; {函数 ...

  4. 函数fsp_seg_inode_page_find_free

    /**********************************************************************//** Looks for an unused segm ...

  5. 深入理解Java虚拟机 - 垃圾收集算法与垃圾收集器

    1. 垃圾收集算法       JVM的垃圾收集算法在不同的JVM实现中有所不同,且在平时工作中一般不会深入到收集算法,因此只对算法做较为简单的介绍.       1.1 标记-清除算法        ...

  6. bzoj2668

    对于这种题很容易看出是费用流吧…… 但这道题不容易建模: 首先是怎么表示目标状态和其实状态,看起来有黑有白很复杂 但实际上,不难发现,白色格子没什么用,起决定作用的是黑格子 也就是我们可以把问题简化: ...

  7. PHP搭建OAuth2.0

    这几天一直在搞OAuth2.0的东西,写SDK啥的,为了更加深入的了解服务端的OAuth验证机制,就自己动手搭了个php下OAuth的环境,并且将它移植到了自己比较熟的tp框架里. 废话不多说,开动. ...

  8. 算法的时间复杂度(大O表示法)

    定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”. 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性 ...

  9. 【转】提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果

    原文网址:http://www.zhimengzhe.com/IOSkaifa/37910.html MBProgressHUD是一个开源项目,实现了很多种样式的提示框,使用上简单.方便,并且可以对显 ...

  10. 【转】Android中的颜色设置

    原文网址:http://www.cnblogs.com/bluestorm/p/3644669.html 1.在android中经常看到设置的颜色为八位的十六进制的颜色值,例如: 1 2 3 publ ...