问题描述
我在尝试将键盘上的切换按钮切换为大写和小写时尝试更新键盘,但是当我销毁并重建键盘时,我遇到了一些问题。 Shift键有一个状态,我用来更改键的颜色。现在,我将转换为小写和大写。我该怎么办?
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
class InputState:
LOWER = 0
CAPITAL = 1
class KeyButton(QPushButton):
sigKeyButtonClicked = pyqtSignal()
def __init__(self,key):
super(KeyButton,self).__init__()
self._key = key
#Keys selected size
if(self._key==' '):
self._activeSize = QSize(325,50)
else:
self._activeSize = QSize(50,50)
self.clicked.connect(self.emitKey)
self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed))
def emitKey(self):
self.sigKeyButtonClicked.emit()
def enterEvent(self,event):
self.setFixedSize(self._activeSize)
def leaveEvent(self,event):
self.setFixedSize(self.sizeHint())
def sizeHint(self):
#Keys standard size
if(self._key==' '):
return QSize(315,40)
else:
return QSize(40,40)
主类:
class VirtualKeyboard(QWidget):
sigInputString = pyqtSignal()
sigKeyButtonClicked = pyqtSignal()
def __init__(self):
super(VirtualKeyboard,self).__init__()
self.globalLayout = QVBoxLayout(self)
self.keysLine0 = QHBoxLayout()
self.keysLine0.setSpacing(5)
self.keysLine1 = QHBoxLayout()
self.keysLine1.setSpacing(5)
self.keysLine2 = QHBoxLayout()
self.keysLine2.setSpacing(5)
self.keysLine3 = QHBoxLayout()
self.keysLine3.setSpacing(5)
self.keysLine4 = QHBoxLayout()
self.keysLine4.setSpacing(5)
self.state = InputState.LOWER
self.keyListByLines = [
['1','2','3','4','5','6','7','8','9','0'],['q','w','e','r','t','y','u','i','o','p'],['a','s','d','f','g','h','j','k','l','ç'],['z','x','c','v','b','n','m'],['.',' ']
]
self.inputString = ""
#Creates Shift key
self.shiftButton = QPushButton(self)
self.shiftButton.setFixedSize(QSize(60,40))
self.shiftButton.setIcon(QIcon('shift.png'))
#Creates Backspace key
self.backspaceButton = QPushButton(self)
self.backspaceButton.setFixedSize(QSize(60,40))
self.backspaceButton.setIcon(QIcon('backspace.png'))
#Creates Cancel key
self.cancelButton = QPushButton(self)
self.cancelButton.setFixedSize(QSize(50,40))
self.cancelButton.setText("SAIR")
#Creates OK key
self.okButton = QPushButton(self)
self.okButton.setFixedSize(QSize(90,40))
self.okButton.setText('ENTER')
#Gives actions to buttons
self.shiftButton.clicked.connect(self.switchState)
self.backspaceButton.clicked.connect(self.backspace)
self.okButton.clicked.connect(self.emitInputString)
self.cancelButton.clicked.connect(self.emitCancel)
#Create input line
self.inputLine = QLineEdit()
for lineIndex,line in enumerate(self.keyListByLines):
for keyIndex,key in enumerate(line):
buttonName = "keyButton" + key.capitalize()
self.__setattr__(buttonName,KeyButton(key))
if(lineIndex==0):
self.keysLine0.addWidget(self.getButtonByKey(key))
self.getButtonByKey(key).setText(key)
if(lineIndex==1):
self.keysLine1.addWidget(self.getButtonByKey(key))
self.getButtonByKey(key).setText(key)
if(lineIndex==2):
self.keysLine2.addWidget(self.getButtonByKey(key))
self.getButtonByKey(key).setText(key)
if(lineIndex==3):
if(keyIndex==0):
self.keysLine3.addWidget(self.shiftButton)
self.keysLine3.addWidget(self.getButtonByKey(key))
self.getButtonByKey(key).setText(key)
if(keyIndex==6):
self.keysLine3.addWidget(self.backspaceButton)
if(lineIndex==4):
if(keyIndex==0):
self.keysLine4.addWidget(self.cancelButton)
#Add Space key
if(key==' '):
self.keysLine4.addWidget(self.getButtonByKey(key))
self.getButtonByKey(key).setText('espaço')
#Add Dot key
else:
self.keysLine4.addWidget(self.getButtonByKey(key))
self.getButtonByKey(key).setText(key)
if(keyIndex==1):
self.keysLine4.addWidget(self.okButton)
self.getButtonByKey(key).sigKeyButtonClicked.connect(lambda v=key: self.addInputByKey(v))
#Creates keyboard layout
self.globalLayout.addWidget(self.inputLine)
self.globalLayout.addLayout(self.keysLine0)
self.globalLayout.addLayout(self.keysLine1)
self.globalLayout.addLayout(self.keysLine2)
self.globalLayout.addLayout(self.keysLine3)
self.globalLayout.addLayout(self.keysLine4)
self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed))
def getButtonByKey(self,key):
return getattr(self,"keyButton" + key.capitalize())
def getLineForButtonByKey(self,key):
return [key in keyList for keyList in self.keyListByLines].index(True)
def switchState(self):
self.state = not self.state
#Changes Shift button color
if (self.state == False):
self.shiftButton.setStyleSheet("background-color : light grey")
else:
self.shiftButton.setStyleSheet("background-color : grey")
def addInputByKey(self,key):
self.inputString += (key.lower(),key.capitalize())[self.state]
self.inputLine.setText(self.inputString)
def backspace(self):
self.inputLine.backspace()
self.inputString = self.inputString[:-1]
def emitInputString(self):
self.sigInputString.emit(self.inputString)
def emitCancel(self):
self.sigInputString.emit()
def sizeHint(self):
return QSize(600,200)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = VirtualKeyboard()
win.show()
app.exec_()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)