介绍该键盘项目的代码实现。
采用垂直布局
QHBoxLayout *h1();
QHBoxLayout *h2();
QHBoxLayout *h3();
QHBoxLayout *h4();
QVBoxLayout *layout = new QVBoxLayout();
layout->setSpacing(BUTTON_SPACING_RATIO*height());
layout->addLayout(h1());
layout->addLayout(h2());
layout->addLayout(h3());
layout->addLayout(h4());
mainLayout->addStretch();
mainLayout->addLayout(layout);
mainLayout->addStretch();
QHBoxLayout *Keyboard::h1()
{
QHBoxLayout *h = new QHBoxLayout;
...
for (int i = 0; i < modeListBar1.count(); i++) {
KeyButton *button = createButton(modeListBar1.at(i));
h->addWidget(button);
}
...
}
KeyButton *Keyboard::createButton(QList<KeyButton::Mode> modes)
{
KeyButton *button = new KeyButton(modes, this);
button->onReponse(this, SLOT(onKeyPressed(const int&, const QString&)));
button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
return button;
}
const QList<Modes> modeListBar1 = {
{{Qt::Key_Q, "q"}, {Qt::Key_Q, "Q"}, {Qt::Key_1, "1"}},
{{Qt::Key_W, "w"}, {Qt::Key_W, "W"}, {Qt::Key_2, "2"}},
{{Qt::Key_E, "e"}, {Qt::Key_E, "E"}, {Qt::Key_3, "3"}},
{{Qt::Key_R, "r"}, {Qt::Key_R, "R"}, {Qt::Key_4, "4"}},
{{Qt::Key_T, "t"}, {Qt::Key_T, "T"}, {Qt::Key_5, "5"}},
{{Qt::Key_Y, "y"}, {Qt::Key_Y, "Y"}, {Qt::Key_6, "6"}},
{{Qt::Key_U, "u"}, {Qt::Key_U, "U"}, {Qt::Key_7, "7"}},
{{Qt::Key_I, "i"}, {Qt::Key_I, "I"}, {Qt::Key_8, "8"}},
{{Qt::Key_O, "o"}, {Qt::Key_O, "O"}, {Qt::Key_9, "9"}},
{{Qt::Key_P, "p"}, {Qt::Key_P, "P"}, {Qt::Key_0, "0"}},
};
KeyButton::KeyButton(const QList<KeyButton::Mode> modes, QWidget *parent) :
QPushButton(parent)
{
...
if (!modes.isEmpty()) {
m_preMode = m_mode = m_modes.first();
setText(m_mode.display);
}
connect(this, SIGNAL(pressed()), this, SLOT(onPressed()));
}
void Keyboard::resizeButton()
{
foreach (KeyButton *button, findChildren<KeyButton *>()) {
...
switch (button->mode().key) {
case Qt::Key_CapsLock:
...
connect(button,
SIGNAL(pressed()),
this,
SLOT(switchCapsLock()),
Qt::UniqueConnection);
break;
case Qt::Key_Mode_switch:
...
connect(button,
SIGNAL(pressed()),
this,
SLOT(switchSpecialChar()),
Qt::UniqueConnection);
break;
default:
break;
}
}
...
}
void Keyboard::switchCapsLock()
{
QList<KeyButton *> buttons = findChildren<KeyButton *>();
foreach(KeyButton *button, buttons)
button->switchCapsLock();
}
void KeyButton::switchCapsLock()
{
if (m_mode.type == SpecialChar)
return;
m_preMode = m_mode;
m_mode = find(m_mode.type == LowerCase ? UpperCase : LowerCase);
setText(m_mode.display);
}
KeyButton *button = new KeyButton(modes, this);
button->onReponse(this, SLOT(onKeyPressed(const int&, const QString&)));
void AbstractKeyboard::onKeyPressed(int key, QString value)
{
QWidget *receiver = QApplication::focusWidget();
if (!receiver)
return;
QKeyEvent keyPress(QEvent::KeyPress, key, Qt::NoModifier, value);
QKeyEvent keyRelease(QEvent::KeyRelease, key, Qt::NoModifier, value);
QApplication::sendEvent(receiver, &keyPress);
QApplication::sendEvent(receiver, &keyRelease);
}