#python #pyqt #qgis #qdockwidget
#python #pyqt #qgis #qdockwidget
Вопрос:
Я пытаюсь добавить некоторую логику в KeyPressedEvent QDockWidget. Он работает без QDockWidget, то есть в главном окне, но он не работает с QDockWidget.
Вот что я пробовал:
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from qgis.core import QgsProject
from .progress_bar import Ui_MainWindow_Progress
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QApplication.translate(context, text, disambig)
class Ui_MainWindow(QMainWindow):
def __init__(self, iface):
super().__init__()
self.iface = iface
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(356, 750)
self.pushButton_exit = QPushButton(MainWindow)
self.pushButton_exit.setGeometry(QtCore.QRect(290, 0, 50, 23))
self.pushButton_exit.setObjectName(_fromUtf8("pushButton_exit"))
self.pushButton_exit.setStyleSheet("background-color: red")
self.label_4 = QLabel(MainWindow)
self.label_4.setGeometry(QtCore.QRect(20, 300, 81, 20))
self.label_4.setObjectName(_fromUtf8("label_4"))
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
self.dock_widget = QDockWidget("My Plugin", self.iface.mainWindow())
self.dock_widget.setWidget(MainWindow)
self.dock_widget.setFixedWidth(356)
self.dock_widget.setFixedHeight(750)
self.iface.addDockWidget(QtCore.Qt.RightDockWidgetArea,
self.dock_widget)
self.dock_widget.setFeatures(QDockWidget.DockWidgetFloatable |
QDockWidget.DockWidgetMovable)
self.dock_widget.keyPressEvent = self.keyPressed
def keyPressed(self, event):
if event.key() == QtCore.Qt.Key_Escape:
print("Escape pressed")
Код работает нормально, но метод keyPressed не вызывается.
Как обработать событие нажатия клавиш QDockWidget?
Комментарии:
1. @eyllanesc Я обновил код. Я пытаюсь перехватить событие нажатия клавиши в закрепленном окне.
2. @eyllanesc Проблема не в этом. Я вызвал его из другого класса. Код работает нормально, но не может ввести метод нажатия клавиши.
3. @eyllanesc Я пытаюсь напечатать «escape нажат» всякий раз, когда нажимается клавиша Escape.
Ответ №1:
keyPressEvent()
: это предопределенная функция в PyQt Framework, используемая для определения функциональных возможностей генерируемого события нажатия клавиши. Обратите внимание, что вы не можете изменить имя его функции, вы можете определить содержимое его аргумента и тело функции в соответствии с вашими требованиями.
event.key() == QtCore.Qt.Key_Escape
используется в функции keyPresssEvent(). Здесь key_Escape используется для упоминания о том, что ключом, который мы собираемся сгенерировать событие, является Escape-ключ.
попробуйте:
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
print("Escape pressed")
Комментарии:
1. Хотя этот код может решить вопрос, включение объяснения того, как и почему это решает проблему, действительно помогло бы улучшить качество вашего поста и, вероятно, привело бы к большему количеству голосов «за». Помните, что вы отвечаете на вопрос для читателей в будущем, а не только для человека, задающего сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и допущения применяются.
Ответ №2:
Я добавил эту строку self.dock_widget.setFocusPolicy (QtCore.Qt.StrongFocus), и теперь она работает нормально.
Комментарии:
1. Это лучшее и простое решение.