你参考一下
#ifndef SELFKEYBOARD_H
#define SELFKEYBOARD_H
#include <QWidget>
#include "ui_selfkeyboard.h"
#include <QtGlobal>
#include <QPushButton>
#include <QTime>
#include <QSignalMapper>
#include "pushbutton.h"
class SelfKeyBoard : public QWidget
{
Q_OBJECT
public:
SelfKeyBoard(QWidget *parent = 0);
~SelfKeyBoard();
signals:
void buttonSignal(const QString &);
private:
Ui::SelfKeyBoardClass ui;
PushButton pushButton[15];
QSignalMapper * signalMapper;
};
#endif // SELFKEYBOARD_H
#include "selfkeyboard.h"
SelfKeyBoard::SelfKeyBoard(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
int i, j, x, y;
QString buttonText[15] = {"0","1","2","3","4","5","6","7","8","9"," ","<-","->","<=","<_|"};
QStringList stringList;
signalMapper = new QSignalMapper;
i = j = x = y = 0;
for(i = 0; i < 15; i++)
{
stringList.append(buttonText);
}
for(j = 0; stringList.count() > 0; j ++)
{
qsrand(QTime::currentTime().msec() + QTime::currentTime().second() * 1000);
ui.gridLayout->addWidget(&pushButton[j], y, x, 1, 1);
i = qrand() % stringList.count();
pushButton[j].setText(stringList.at(i));
signalMapper->setMapping(&pushButton[j], stringList.at(i));
connect(&pushButton[j], SIGNAL(clicked()), signalMapper, SLOT(map()));
//connect(&pushButton[j], SIGNAL(pressed()), signalMapper, SLOT(map()));
stringList.removeAt(i);
x++;
if (5 == x)
{
y++;
x = 0;
}
}
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SIGNAL(buttonSignal(const QString &)));
}
SelfKeyBoard::~SelfKeyBoard()
{
}
#include "psword.h"
void fun(QString s)
{
}
PSWord::PSWord(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
//this->pline->setFocusPolicy(Qt::ClickFocus);
keyBoard = new SelfKeyBoard(this);
pline = new LineEdit(this);
//pline->setReadOnly(true);
this->ui.formLayout->setWidget(0, QFormLayout::FieldRole, pline);
//this->ui.formLayout->setWidget(1, QFormLayout::FieldRole, keyBoard);
connect(pline, SIGNAL(FocusInSignal()), this, SLOT(FocusInSlot()));
//connect(pline, SIGNAL(FocusOutSignal()), this, SLOT(FocusOutSlot()));
//keyBoard->setGeometry(pline->x(), pline->y() + pline->height(),240 , 100);
keyBoard->setFixedSize(200 , 100);
this->ui.formLayout->addRow(NULL, keyBoard);
keyBoard->hide();
this->pline->setFocus();
connect(keyBoard, SIGNAL(buttonSignal(const QString &)), this, SLOT(KeyDealSlot(const QString &)));
}
PSWord::~PSWord()
{
}
void PSWord::FocusChangedSlot(QWidget * old,QWidget * now)
{
/*if(now == (QWidget *)(this->pline))
{
keyBoard->show();
}
else
{
keyBoard->hide();
}*/
}
void PSWord::KeyDealSlot(const QString & key)
{
if (QString("<_|") == key)
{
FunctionEnter(fun, pline->text());
}
else if (QString("<-") == key)
{
pline->cursorBackward(false);
}
else if (QString("->") == key)
{
pline->cursorForward(false);
}
else if (QString("<=") == key)
{
pline->backspace();
}
else
{
this->pline->insert(key);
}
keyBoard->show();
this->pline->setFocus();
}
void PSWord::FunctionEnter(void (* ptrFun)(QString),QString s)
{
ptrFun(s);
}
/*void PSWord::FocusOutSlot()
{
keyBoard->hide();
}*/
void PSWord::FocusInSlot()
{
keyBoard->show();
this->pline->setFocus();
}
void PSWord::mousePressEvent(QMouseEvent * event)
{
keyBoard->hide();
this->pline->setFocus();
}
#ifndef PSWORD_H
#define PSWORD_H
#include <QtGui/QMainWindow>
#include "ui_psword.h"
#include "selfkeyboard.h"
#include "lineedit.h"
class PSWord : public QMainWindow
{
Q_OBJECT
public:
PSWord(QWidget *parent = 0, Qt::WFlags flags = 0);
~PSWord();
void FunctionEnter(void (* ptrFun)(QString),QString);
public slots:
void FocusChangedSlot(QWidget * old = NULL,QWidget * now = NULL);
void KeyDealSlot(const QString &);
//void FocusOutSlot();
void FocusInSlot();
protected:
virtual void mousePressEvent(QMouseEvent * event);
private:
Ui::PSWordClass ui;
SelfKeyBoard * keyBoard;
LineEdit * pline;
};
#endif // PSWORD_H