Qt界面开发时如何使用自定义控件

本文详细介绍如何在Qt中创建自定义数字键盘控件,包括类定义、信号槽连接及界面设计,适用于需要数字输入的项目。

在界面开始时,往往会碰到一些库里没有的控件,这时就需要按照自身的需要去创建一些适合项目开发的控件,本文以一个自定义数字键盘为例来说明怎样使用自定义控件,话不多说,直接上干货。

首先,建立一个数字键盘的类,取名叫NumberKeyboard,该类的定义如下:

#ifndef NUMBERKEYBOARD_H
#define NUMBERKEYBOARD_H

#include <QWidget>
#include <QDialog>
#include <QSignalMapper>

namespace Ui {
class NumberKeyboard;
}

class NumberKeyboard : public QDialog
{
    Q_OBJECT

public:
    explicit NumberKeyboard(QWidget *parent = 0);
    ~NumberKeyboard();
    QString getString();

signals:
    void editFinish();
    void clickNum(QString str);
    void chopNum();

private slots:
    void insertNum(const QString&);
    void deleteNum();
    bool confirmNum();
private:
    Ui::NumberKeyboard *ui;
    QSignalMapper *numMapper; 
    QString number;
};

#endif // NUMBERKEYBOARD_H

numberkeyboard.cpp的实现如下:

#include "numberkeyboard.h"
#include "ui_numberkeyboard.h"
#include <QDebug>
#include <QApplication>
#include <QDesktopWidget>

NumberKeyboard::NumberKeyboard(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::NumberKeyboard)
{
    ui->setupUi(this);

    int deskHeight = QApplication::desktop()->height();
    int deskWidth  = QApplication::desktop()->width();
    qDebug() << "-----------------height, width=========" << deskHeight << deskWidth;
    this->resize(deskHeight*2/3, deskWidth/2);
    this->move(deskHeight/3, deskWidth/4);

    setFocusPolicy(Qt::NoFocus);
    setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);

    numMapper = new QSignalMapper;
    connect(numMapper, SIGNAL(mapped(const QString&)), this, SLOT(insertNum(const QString&)));

    numMapper->setMapping(ui->pushButton_0, "0");
    connect(ui->pushButton_0, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_1, "1");
    connect(ui->pushButton_1, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_2, "2");
    connect(ui->pushButton_2, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_3, "3");
    connect(ui->pushButton_3, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_4, "4");
    connect(ui->pushButton_4, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_5, "5");
    connect(ui->pushButton_5, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_6, "6");
    connect(ui->pushButton_6, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_7, "7");
    connect(ui->pushButton_7, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_8, "8");
    connect(ui->pushButton_8, SIGNAL(clicked()), numMapper, SLOT(map()));

    numMapper->setMapping(ui->pushButton_9, "9");
    connect(ui->pushButton_9, SIGNAL(clicked()), numMapper, SLOT(map()));

    connect(ui->pushButton_CLR, SIGNAL(clicked()), this, SLOT(deleteNum()));
    connect(ui->pushButton_OK, SIGNAL(clicked()), this, SLOT(confirmNum()));

}

NumberKeyboard::~NumberKeyboard()
{
    delete ui;
}

void NumberKeyboard::insertNum(const QString& newString)
{
    number.append(newString);
    ui->displayNumLineEdit->setText(number);
    qDebug() << "-----------insert number-----------" << number;
}

void NumberKeyboard::deleteNum()
{
    number.chop(1);
    ui->displayNumLineEdit->setText(number);
    qDebug() << "-----------delete number----------" << number;
}

bool NumberKeyboard::confirmNum()
{
    return close();
    number.clear();
}

QString NumberKeyboard::getString()
{
    return ui->displayNumLineEdit->text();
}

当然,上面代码是需要和界面配合起来使用的,大家可以尝试一下,用Qt设计师设计出以下的界面:

接下来,重新定义QLineEdit类,NumKeyboardLineEdit.h

#ifndef NUMKEYBOARDLINEEDIT_H
#define NUMKEYBOARDLINEEDIT_H

#include <QWidget>
#include <QLineEdit>
#include <QMouseEvent>
#include "numberkeyboard.h"


class NumKeyBoardLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    NumKeyBoardLineEdit(QWidget *parent = 0);
    ~NumKeyBoardLineEdit();

protected:
    void mousePressEvent(QMouseEvent *event);

public slots:
    void slotClickNumKeyboard(QWidget *pWidget);

signals:
    void clickEdit(QWidget *);
    void finishEdit(QString);
};

#endif // NUMKEYBOARDLINEEDIT_H

NumKeyboardLineEdit.cpp代码如下:

#include "numkeyboardlineedit.h"

NumKeyBoardLineEdit::NumKeyBoardLineEdit(QWidget *parent)
                    :QLineEdit(parent)
{
    QObject::connect(this, SIGNAL(clickEdit(QWidget *)), this, SLOT(slotClickNumKeyboard(QWidget *)));
}

NumKeyBoardLineEdit::~NumKeyBoardLineEdit()
{

}

void NumKeyBoardLineEdit::mousePressEvent(QMouseEvent *event)
{
    emit clickEdit(this);
    QLineEdit::mousePressEvent(event);
}

void NumKeyBoardLineEdit::slotClickNumKeyboard(QWidget *pWidget)
{
    NumberKeyboard *pInput = new NumberKeyboard(pWidget);

    if(pInput->exec() < 0)
    {
        disconnect(this, SIGNAL(clickEdit(QWidget*)), this, SLOT(slotClickNumKeyboard(QWidget*)));
        return;
    }

    QString endString = pInput->getString();
    if(endString != QString(""))
    {
        this->setText(endString);
        emit finishEdit(endString);
    }

    delete pInput;
}

至此,自定义控件的工作就告一段落,在下次使用时就可以将QLineEdit控件的父类指定为自己定义的类,也可以调用其中的方法。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值