python - Ctrl + Alt-tast modifikator adfærd med Qt på Windows, når en tekstboks har fokus

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg lavede et hurtigt prøveprogram for at demonstrere problemet


import sys

from  PyQt4 import QtGui
from PyQt4.QtCore import Qt

class AWindow(QtGui.QMainWindow):
    def \_\_init\_\_(self, parent=None):
        super(AWindow, self).\_\_init\_\_(parent=parent)

        self.setCentralWidget(QtGui.QWidget())
        self.centralWidget().setLayout(QtGui.QFormLayout())

        self.centralWidget().layout().addRow(
            QtGui.QLabel('some text'),
            QtGui.QLineEdit()
            )
        self.centralWidget().layout().addRow(
            QtGui.QLabel('some text'),
            QtGui.QCheckBox('this is checkbox')            
            )

    def keyPressEvent(self, e):
        if int(e.modifiers()) == (Qt.ControlModifier+Qt.AltModifier):
            if e.key() == Qt.Key\_K:
                #when ctrl+alt+k is pressed, a message box should open
                msg = QtGui.QMessageBox(
                    QtGui.QMessageBox.Information,
                    'w00t',
                    'You pressed ctrl+alt+k'
                    )
            msg.exec\_()
def main():
    app = QtGui.QApplication(sys.argv)
    w = AWindow()
    w.show()
    sys.exit(app.exec\_())

if \_\_name\_\_ == '\_\_main\_\_':
    main()


Problemet


I denne prøve indfanger jeg ctrl + alt + k-tastaturgenvejen. Problemet er, at hvis en tekstindtastnings widget har tastaturfokuseret, når disse nøgler trykkes, er den ikke fanget af keyPressEevent-handleren, i stedet er en stor boks K skrevet ind i boksen. (Dette er det samme med alle ctrl + alt tastaturer).


Hvis en anden slags widget er fokuseret, er en, der ikke accepterer tekstindtastning (f.eks. En afkrydsningsfelt, knap), tastetrykket registreret som det skal og i prøven, vises meddelelsesboksen.

Også tastaturgenveje, der kun bruger en Ctrl-modifikator, fungerer fint.


Dette problem præsenterer kun det selv på Windows, men ikke på Linux, så det fører mig til at tro, at dette har noget at gøre med, hvordan Windows håndterer Ctrl + Alt Modifier, eller måske tager jeg mig ikke korrekt i.


Er der nogen måde at løse dette på?


Rediger


Jeg har afledt denne løsning fra Spideys kommentar.

Jeg underklasserede QLineEdit og håndterede det s keyPressEvent som dette.


#EDIT: this doesn't work, see below
def keyPressEvent(self, e):
    if e.modifiers() and Qt.ControlModifier and Qt.AltModifier:
        e.ignore()
    super(CoolLineEdit, self).keyPressEvent(e)


Rediger igen


Tilføjelse af modifikatorerne som ints og retur efter e.ignore () (måske ignorere er ikke nødvendigt) synes at være meget vigtigt.

Dette er den rigtige løsning.


def keyPressEvent(self, e):
    if int(e.modifiers()) == (QtCore.Qt.ControlModifier+QtCore.Qt.AltModifier):
        e.ignore()
        return
    super(SaveLineEdit, self).keyPressEvent(e)            

Bedste reference


QLineEdit, når den har fokus, håndterer `QKeyEvent. Hvis du har brug for denne funktionalitet på Windows, foreslår jeg:


1) Aflede en klasse fra QLineEdit (eller hvilken som helst QTextEdit -afledt klasse, du vil have).


2) Overstyr virtual void keyPressEvent(QKeyEvent* e) og kontroller for din specifikke tastekombination.


3) Hvis du finder det, returner du uden at håndtere det, og det vil falde til næste niveau (dit vindue, som vil fange det og udskrive din besked).


4) Hvis du ikke finder det, skal du ringe basisklassens version af funktionen: BaseClass::keyPressEvent(e);, så de normale tastetryk håndteres korrekt.


Undskyld for c + + syntaks, jeg har ikke brugt PyQt.