QT控件大全 三十八 QWidgetKeyboard

本文介绍了一个基于Qt的虚拟键盘的设计与实现过程。该虚拟键盘支持多种按键状态切换,包括大小写切换、特殊字符切换等,并能模拟键盘事件。此外,还提供了透明度调节、声音反馈等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果如图:

核心代码:

#ifndef __WIDGETKEYBOARD_H_
#define __WIDGETKEYBOARD_H_

#include <QWidget>
#include "ui_WidgetKeyboard.h"
class QSignalMapper;

class WidgetKeyboard : public QWidget, public Ui::WidgetKeyboard
{
    Q_OBJECT
    
    private:
		QWidget *m_pParent;
		qreal opacity;
		bool isCaps;
		bool isShift;
		bool isCtrl;
		bool isAlt;
		bool isIns;
		QSignalMapper *signalMapper;
		QList<QToolButton *> allButtons;
		QString soundFilePath;
        
    private slots:
		void on_btn_clicked(int btn);
		void on_btnCaps_toggled(bool checked);
		void on_btnShiftLeft_toggled(bool checked);
		void on_btnShiftRight_toggled(bool checked);
		void on_btnCtrlLeft_toggled(bool checked);
		void on_btnAltLeft_toggled(bool checked);
		void on_btnIns_clicked();
		void on_btnPrint_clicked();
		void on_sliderOpacity_valueChanged(int);
		void changeTextShift(bool isShift);
		void changeTextCaps(bool isCaps);
		bool checkNotTextKey(int keyId);
		void on_checkBoxShowNumPad_stateChanged(int state);

    public:
		WidgetKeyboard(QWidget *parent = NULL);
		~WidgetKeyboard();
		void setOpacity(int);
		int getOpacity();
		void setSoundDisabled();
		void setSoundEnabled(QString soundPath);
};
#endif /*__WIDGETKEYBOARD_H_*/
#include "WidgetKeyboard.h"
#include <QKeyEvent>
#include <QSignalMapper>
#include <QSound>
#include <QMessageBox>
#include <QDesktopWidget>
#include <QClipboard>
#include <QList>

WidgetKeyboard::WidgetKeyboard(QWidget *parent) : QWidget(0)
{
    setupUi(this);
    resize(0,0);
    this->setWindowFlags(Qt::Tool);
    m_pParent = parent;
    isCaps = false;
    isShift = false;
    isCtrl = false;
    isAlt = false;
	isIns = false;
    changeTextCaps(false);
    signalMapper = new QSignalMapper(this);
    sliderOpacity->setRange(20,100);
    allButtons = findChildren<QToolButton *>();
    for (int i=0;i<allButtons.count();i++) {
        connect(allButtons.at(i), SIGNAL(clicked()), signalMapper, SLOT(map()));
        signalMapper->setMapping(allButtons.at(i), i);
    }
    connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(on_btn_clicked(int)));
}

WidgetKeyboard::~WidgetKeyboard()
{
	delete signalMapper;
}

void WidgetKeyboard::on_btn_clicked(int btn)
{
	if(! soundFilePath.isEmpty())
		QSound::play(soundFilePath);
	QString strKeyId;
    strKeyId = allButtons.at(btn)->accessibleName();
    bool isOk;
    int keyId = strKeyId.toInt(&isOk, 16);
    if (strKeyId.isEmpty() || !isOk) {
        QMessageBox::information(0,0,"Key Not Found");
        return;
    }
    
    //Keys to be handled separately
	if (keyId==Qt::Key_Shift
		|| keyId==Qt::Key_Control
		|| keyId==Qt::Key_Alt
		|| keyId==Qt::Key_Print
		)
        return;

    int involvedKeys = 1;
    Qt::KeyboardModifiers Modifier = Qt::NoModifier;
    if (isCtrl) {
        Modifier = Modifier | Qt::ControlModifier;
        involvedKeys++;
    }
    if (isShift) {
        Modifier = Modifier | Qt::ShiftModifier;
        involvedKeys++;
    }
    if (isAlt) {
        Modifier = Modifier | Qt::AltModifier;
        involvedKeys++;
    }    
    
    bool isTextKey = false;

	if(keyId==Qt::Key_Insert && !isShift)
		return;
	

	QString ch = allButtons.at(btn)->text().trimmed();
    if (ch=="&&")
        ch="&";
	else if (keyId==Qt::Key_Space)
        ch = " ";
    else if (checkNotTextKey(keyId))
		ch = QString();
	else
		isTextKey = true;
	    

	if(isIns && isTextKey) {
		QKeyEvent keyEventIns(QEvent::KeyPress, Qt::Key_Delete, Qt::NoModifier);
		QApplication::sendEvent(m_pParent->focusWidget(), &keyEventIns);
	}

	QKeyEvent keyEvent(QEvent::KeyPress, keyId, Modifier, ch, false, involvedKeys);
    QApplication::sendEvent(m_pParent->focusWidget(), &keyEvent);

    
    btnShiftLeft->setChecked(false);
	btnShiftRight->setChecked(false);
    btnCtrlLeft->setChecked(false);
    btnAltLeft->setChecked(false);
}

void WidgetKeyboard::on_btnCaps_toggled(bool checked)
{
    changeTextCaps(checked);
    isCaps = checked;
}

void WidgetKeyboard::on_btnShiftLeft_toggled(bool checked)
{
    isShift = checked;
    if (isCaps) {
        changeTextShift(checked);
    }
    else {
        changeTextShift(checked);
        changeTextCaps(checked);
    }
}

void WidgetKeyboard::on_btnShiftRight_toggled(bool checked)
{
    on_btnShiftLeft_toggled(checked);
}

void WidgetKeyboard::on_btnCtrlLeft_toggled(bool checked)
{
    isCtrl = checked;
}

void WidgetKeyboard::on_btnAltLeft_toggled(bool checked)
{
    isAlt = checked;
}

void WidgetKeyboard::on_btnIns_clicked()
{
	isIns = !isIns;
}

void WidgetKeyboard::on_btnPrint_clicked()
{
	QPixmap screen = QPixmap::grabWindow(QApplication::desktop()->winId());
	QClipboard *cb = QApplication::clipboard();
	cb->setPixmap(screen, QClipboard::Clipboard);
}

void WidgetKeyboard::on_sliderOpacity_valueChanged(int val)
{
    opacity = 120.0 - val;
    opacity /= 100.0;    
    setWindowOpacity(opacity);    
}

void WidgetKeyboard::changeTextShift(bool isShift)
{    
    changeTextCaps(!isShift);
    if (isShift) {
		btnTilt->setText(QChar('~'));
        btn1->setText(QChar('!'));
        btn2->setText(QChar('@'));
        btn3->setText(QChar('#'));
        btn4->setText(QChar('$'));
        btn5->setText(QChar('%'));
        btn6->setText(QChar('^'));        
        btn7->setText("&&");
        btn8->setText(QChar('*'));
        btn9->setText(QChar('('));
        btn0->setText(QChar(')'));
        btnHiphen->setText(QChar('_'));
        btnAssign->setText(QChar('+'));
        
        btnStartSquare->setText(QChar('{'));
        btnCloseSquare->setText(QChar('}'));
        btnFwdSlash->setText(QChar('|'));
        
        btnSemiColon->setText(QChar(':'));
        btnSp->setText(QChar('"'));
            
        btnComma->setText(QChar('<'));
        btnPeriod->setText(QChar('>'));
        btnBcwdSlash->setText(QChar('?'));
	}
    else {
		btnTilt->setText(QChar('`'));
        btn1->setText(QChar('1'));
        btn2->setText(QChar('2'));
        btn3->setText(QChar('3'));
        btn4->setText(QChar('4'));
        btn5->setText(QChar('5'));
        btn6->setText(QChar('6'));
        btn7->setText(QChar('7'));
        btn8->setText(QChar('8'));
        btn9->setText(QChar('9'));
        btn0->setText(QChar('0'));
        btnHiphen->setText(QChar('-'));
        btnAssign->setText(QChar('='));
            
        btnStartSquare->setText(QChar('['));
        btnCloseSquare->setText(QChar(']'));
        btnFwdSlash->setText(QChar('\\'));
        
        btnSemiColon->setText(QChar(';'));
        btnSp->setText(QChar('\''));
        
        btnComma->setText(QChar(','));
        btnPeriod->setText(QChar('.'));
        btnBcwdSlash->setText(QChar('/'));
    }
}

void WidgetKeyboard::changeTextCaps(bool isCaps)
{    
    if (isCaps) {
        btnQ->setText(QChar('Q'));
        btnW->setText(QChar('W'));
        btnE->setText(QChar('E'));
        btnR->setText(QChar('R'));
        btnT->setText(QChar('T'));
        btnY->setText(QChar('Y'));
        btnU->setText(QChar('U'));
        btnI->setText(QChar('I'));
        btnO->setText(QChar('O'));
        btnP->setText(QChar('P'));

        btnA->setText(QChar('A'));
        btnS->setText(QChar('S'));
        btnD->setText(QChar('D'));
        btnF->setText(QChar('F'));
        btnG->setText(QChar('G'));
        btnH->setText(QChar('H'));
        btnJ->setText(QChar('J'));
        btnK->setText(QChar('K'));
        btnL->setText(QChar('L'));
                
        btnZ->setText(QChar('Z'));
        btnX->setText(QChar('X'));
        btnC->setText(QChar('C'));
        btnV->setText(QChar('V'));
        btnB->setText(QChar('B'));
        btnN->setText(QChar('N'));
        btnM->setText(QChar('M'));        
    }
	else {
        btnQ->setText(QChar('q'));
        btnW->setText(QChar('w'));
        btnE->setText(QChar('e'));
        btnR->setText(QChar('r'));
        btnT->setText(QChar('t'));
        btnY->setText(QChar('y'));
        btnU->setText(QChar('u'));
        btnI->setText(QChar('i'));
        btnO->setText(QChar('o'));
        btnP->setText(QChar('p'));

        btnA->setText(QChar('a'));
        btnS->setText(QChar('s'));
        btnD->setText(QChar('d'));
        btnF->setText(QChar('f'));
        btnG->setText(QChar('g'));
        btnH->setText(QChar('h'));
        btnJ->setText(QChar('j'));
        btnK->setText(QChar('k'));
        btnL->setText(QChar('l'));
        
        btnZ->setText(QChar('z'));
        btnX->setText(QChar('x'));
        btnC->setText(QChar('c'));
        btnV->setText(QChar('v'));
        btnB->setText(QChar('b'));
        btnN->setText(QChar('n'));
        btnM->setText(QChar('m'));
    }
}

bool WidgetKeyboard::checkNotTextKey(int keyId)
{
	if (keyId==Qt::Key_Shift
            || keyId==Qt::Key_Control
            || keyId==Qt::Key_Tab
            || keyId==Qt::Key_Escape
            || keyId==Qt::Key_Return
            || keyId==Qt::Key_Insert
            || keyId==Qt::Key_NumLock
            || keyId==Qt::Key_F1
            || keyId==Qt::Key_F2
            || keyId==Qt::Key_F3
            || keyId==Qt::Key_F4
            || keyId==Qt::Key_F5
            || keyId==Qt::Key_F6
            || keyId==Qt::Key_F7
            || keyId==Qt::Key_F8
            || keyId==Qt::Key_F9
            || keyId==Qt::Key_F10
            || keyId==Qt::Key_F11
            || keyId==Qt::Key_F12
            || keyId==Qt::Key_Print
            || keyId==Qt::Key_Pause
            || keyId==Qt::Key_ScrollLock
            || keyId==Qt::Key_Enter
            || keyId==Qt::Key_Home
            || keyId==Qt::Key_End
            || keyId==Qt::Key_CapsLock
            || keyId==Qt::Key_Insert
            || keyId==Qt::Key_Delete
            || keyId==Qt::Key_PageUp
            || keyId==Qt::Key_PageDown
            || keyId==Qt::Key_Down
            || keyId==Qt::Key_Up
            || keyId==Qt::Key_Left
            || keyId==Qt::Key_Right
			|| keyId==Qt::Key_Alt) {
				return true;
	}
	else
		return false;
}

void WidgetKeyboard::setOpacity(int opacity)
{
    sliderOpacity->setValue(opacity);
}

int WidgetKeyboard::getOpacity()
{
    return sliderOpacity->value();
}

void WidgetKeyboard::setSoundDisabled()
{
	soundFilePath = "";
}

/* 
Microsoft Windows : The underlying multimedia system is used; only WAVE format sound files are supported.
X11	: The Network Audio System is used if available, otherwise all operations work silently. NAS supports WAVE and AU files.
Mac OS X : NSSound is used. All formats that NSSound supports, including QuickTime formats, are supported by Qt for Mac OS X.
Qt for Embedded Linux : A built-in mixing sound server is used, accessing /dev/dsp directly. Only the WAVE format is supported.
*/

void WidgetKeyboard::setSoundEnabled(QString soundPath)
{
	soundFilePath = soundPath;
}

void WidgetKeyboard::on_checkBoxShowNumPad_stateChanged(int state)
{
	QList<QWidget *> children = frameNumPad->findChildren<QWidget *>();
	if(state==Qt::Checked)
	{
		frameNumPad->show();
		/*for each(QWidget *child in children)
			child->show();*/
	}
	else
	{
		frameNumPad->hide();
		/*for each(QWidget *child in children)
			child->hide();*/
	}
	update();
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vqt5_qt6

你的鼓励是我们创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值