在界面开始时,往往会碰到一些库里没有的控件,这时就需要按照自身的需要去创建一些适合项目开发的控件,本文以一个自定义数字键盘为例来说明怎样使用自定义控件,话不多说,直接上干货。
首先,建立一个数字键盘的类,取名叫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控件的父类指定为自己定义的类,也可以调用其中的方法。
本文详细介绍如何在Qt中创建自定义数字键盘控件,包括类定义、信号槽连接及界面设计,适用于需要数字输入的项目。
345

被折叠的 条评论
为什么被折叠?



