销毁并重建QVBoxLayout

问题描述

我在尝试将键盘上的切换按钮切换为大写和小写时尝试更新键盘,但是当我销毁并重建键盘时,我遇到了一些问题。 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_()

Keyboard Layout

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)