2017-10-12 32 views
0

雖然我意識到其他人也提出了類似的問題,但我的有限知識似乎導致了這個難題的缺失。我將進一步解釋爲什麼這個問題在下面之前沒有得到解答。如何在PyQT5中爲QPlainTextEdit(或任何其他組件)實現關鍵監聽器

這裏是我與(由Qt Creator中產生的)工作的代碼

from PyQt5 import QtCore, QtGui, QtWidgets, Qt 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(1000, 606) 
     MainWindow.setMinimumSize(QtCore.QSize(1000, 600)) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) 
     self.tabWidget.setGeometry(QtCore.QRect(0, 0, 991, 561)) 
     self.tabWidget.setObjectName("tabWidget") 
     self.tab = QtWidgets.QWidget() 
     self.tab.setObjectName("tab") 
     self.gridLayoutWidget = QtWidgets.QWidget(self.tab) 
     self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 991, 491)) 
     self.gridLayoutWidget.setObjectName("gridLayoutWidget") 
     self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) 
     self.gridLayout.setContentsMargins(0, 0, 0, 0) 
     self.gridLayout.setObjectName("gridLayout") 
     spacerItem = QtWidgets.QSpacerItem(200, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 
     self.gridLayout.addItem(spacerItem, 3, 2, 1, 1) 
     spacerItem1 = QtWidgets.QSpacerItem(200, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 
     self.gridLayout.addItem(spacerItem1, 3, 0, 1, 1) 
     self.verticalLayout = QtWidgets.QVBoxLayout() 
     self.verticalLayout.setObjectName("verticalLayout") 
     self.label = QtWidgets.QLabel(self.gridLayoutWidget) 
     self.label.setObjectName("label") 
     self.verticalLayout.addWidget(self.label) 
     self.tbxUser = QtWidgets.QLineEdit(self.gridLayoutWidget) 
     self.tbxUser.setAlignment(QtCore.Qt.AlignCenter) 
     self.tbxUser.setObjectName("tbxUser") 
     self.verticalLayout.addWidget(self.tbxUser) 
     self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget) 
     self.label_2.setObjectName("label_2") 
     self.verticalLayout.addWidget(self.label_2) 
     self.tbxPass = QtWidgets.QLineEdit(self.gridLayoutWidget) 
     self.tbxPass.setEchoMode(QtWidgets.QLineEdit.Password) 
     self.tbxPass.setAlignment(QtCore.Qt.AlignCenter) 
     self.tbxPass.setObjectName("tbxPass") 
     self.verticalLayout.addWidget(self.tbxPass) 
     self.verticalLayout_4 = QtWidgets.QVBoxLayout() 
     self.verticalLayout_4.setObjectName("verticalLayout_4") 
     self.btnLogin = QtWidgets.QPushButton(self.gridLayoutWidget) 
     self.btnLogin.setObjectName("btnLogin") 
     self.verticalLayout_4.addWidget(self.btnLogin) 
     self.chxLogin = QtWidgets.QCheckBox(self.gridLayoutWidget) 
     self.chxLogin.setLayoutDirection(QtCore.Qt.RightToLeft) 
     self.chxLogin.setChecked(True) 
     self.chxLogin.setObjectName("chxLogin") 
     self.verticalLayout_4.addWidget(self.chxLogin) 
     self.verticalLayout.addLayout(self.verticalLayout_4) 
     self.lstEntries = QtWidgets.QListWidget(self.gridLayoutWidget) 
     self.lstEntries.setObjectName("lstEntries") 
     self.verticalLayout.addWidget(self.lstEntries) 
     self.gridLayout.addLayout(self.verticalLayout, 3, 1, 1, 1) 
     self.tbxLoginStatus = QtWidgets.QTextEdit(self.tab) 
     self.tbxLoginStatus.setEnabled(False) 
     self.tbxLoginStatus.setGeometry(QtCore.QRect(0, 490, 991, 21)) 
     self.tbxLoginStatus.setObjectName("tbxLoginStatus") 
     self.prgEntries = QtWidgets.QProgressBar(self.tab) 
     self.prgEntries.setGeometry(QtCore.QRect(0, 510, 991, 23)) 
     self.prgEntries.setProperty("value", 0) 
     self.prgEntries.setObjectName("prgEntries") 
     self.tabWidget.addTab(self.tab, "") 
     self.tab_3 = QtWidgets.QWidget() 
     self.tab_3.setObjectName("tab_3") 
     self.frame = QtWidgets.QFrame(self.tab_3) 
     self.frame.setGeometry(QtCore.QRect(0, 0, 991, 541)) 
     self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) 
     self.frame.setFrameShadow(QtWidgets.QFrame.Raised) 
     self.frame.setObjectName("frame") 
     self.lstSentences = QtWidgets.QListWidget(self.frame) 
     self.lstSentences.setGeometry(QtCore.QRect(0, 0, 221, 491)) 
     self.lstSentences.setObjectName("lstSentences") 
     self.verticalLayoutWidget_3 = QtWidgets.QWidget(self.frame) 
     self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(220, 0, 541, 491)) 
     self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3") 
     self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3) 
     self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) 
     self.verticalLayout_3.setObjectName("verticalLayout_3") 
     self.tbxOriginal = QtWidgets.QTextEdit(self.verticalLayoutWidget_3) 
     self.tbxOriginal.setEnabled(False) 
     self.tbxOriginal.setObjectName("tbxOriginal") 
     self.verticalLayout_3.addWidget(self.tbxOriginal) 
     self.tbxHtml = QtWidgets.QTextEdit(self.verticalLayoutWidget_3) 
     self.tbxHtml.setEnabled(False) 
     self.tbxHtml.setObjectName("tbxHtml") 
     self.verticalLayout_3.addWidget(self.tbxHtml) 
     self.tbxPlain = QtWidgets.QPlainTextEdit(self.verticalLayoutWidget_3) 
     self.tbxPlain.setObjectName("tbxPlain") 
     self.verticalLayout_3.addWidget(self.tbxPlain) 
     self.btnSaveSentence = QtWidgets.QPushButton(self.verticalLayoutWidget_3) 
     self.btnSaveSentence.setObjectName("btnSaveSentence") 
     self.verticalLayout_3.addWidget(self.btnSaveSentence) 
     self.horizontalLayout_2 = QtWidgets.QHBoxLayout() 
     self.horizontalLayout_2.setObjectName("horizontalLayout_2") 
     self.tbxNotesLeft = QtWidgets.QTextEdit(self.verticalLayoutWidget_3) 
     self.tbxNotesLeft.setObjectName("tbxNotesLeft") 
     self.horizontalLayout_2.addWidget(self.tbxNotesLeft) 
     self.tbxNotesRight = QtWidgets.QTextEdit(self.verticalLayoutWidget_3) 
     self.tbxNotesRight.setObjectName("tbxNotesRight") 
     self.horizontalLayout_2.addWidget(self.tbxNotesRight) 
     self.verticalLayout_3.addLayout(self.horizontalLayout_2) 
     self.tbxComment = QtWidgets.QPlainTextEdit(self.verticalLayoutWidget_3) 
     self.tbxComment.setEnabled(False) 
     self.tbxComment.setObjectName("tbxComment") 
     self.verticalLayout_3.addWidget(self.tbxComment) 
     self.lstCorrections = QtWidgets.QListWidget(self.frame) 
     self.lstCorrections.setGeometry(QtCore.QRect(760, 0, 231, 491)) 
     self.lstCorrections.setObjectName("lstCorrections") 
     self.prgStatus = QtWidgets.QProgressBar(self.frame) 
     self.prgStatus.setGeometry(QtCore.QRect(0, 510, 1001, 23)) 
     self.prgStatus.setProperty("value", 0) 
     self.prgStatus.setObjectName("prgStatus") 
     self.tbxEditStatus = QtWidgets.QTextEdit(self.frame) 
     self.tbxEditStatus.setEnabled(False) 
     self.tbxEditStatus.setGeometry(QtCore.QRect(0, 490, 991, 21)) 
     self.tbxEditStatus.setObjectName("tbxEditStatus") 
     self.tabWidget.addTab(self.tab_3, "") 
     self.widget = QtWidgets.QWidget() 
     self.widget.setObjectName("widget") 
     self.gridLayoutWidget_2 = QtWidgets.QWidget(self.widget) 
     self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 991, 541)) 
     self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2") 
     self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2) 
     self.gridLayout_2.setContentsMargins(0, 0, 0, 0) 
     self.gridLayout_2.setObjectName("gridLayout_2") 
     spacerItem2 = QtWidgets.QSpacerItem(100, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 
     self.gridLayout_2.addItem(spacerItem2, 0, 0, 1, 1) 
     spacerItem3 = QtWidgets.QSpacerItem(100, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 
     self.gridLayout_2.addItem(spacerItem3, 0, 2, 1, 1) 
     self.verticalLayout_2 = QtWidgets.QVBoxLayout() 
     self.verticalLayout_2.setObjectName("verticalLayout_2") 
     self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget_2) 
     self.label_3.setObjectName("label_3") 
     self.verticalLayout_2.addWidget(self.label_3) 
     self.tbxTitle = QtWidgets.QLineEdit(self.gridLayoutWidget_2) 
     self.tbxTitle.setObjectName("tbxTitle") 
     self.verticalLayout_2.addWidget(self.tbxTitle) 
     self.label_4 = QtWidgets.QLabel(self.gridLayoutWidget_2) 
     self.label_4.setObjectName("label_4") 
     self.verticalLayout_2.addWidget(self.label_4) 
     self.tbxBody = QtWidgets.QPlainTextEdit(self.gridLayoutWidget_2) 
     self.tbxBody.setObjectName("tbxBody") 
     self.verticalLayout_2.addWidget(self.tbxBody) 
     self.horizontalLayout = QtWidgets.QHBoxLayout() 
     self.horizontalLayout.setObjectName("horizontalLayout") 
     self.btnPublish = QtWidgets.QPushButton(self.gridLayoutWidget_2) 
     self.btnPublish.setObjectName("btnPublish") 
     self.horizontalLayout.addWidget(self.btnPublish) 
     self.verticalLayout_2.addLayout(self.horizontalLayout) 
     self.gridLayout_2.addLayout(self.verticalLayout_2, 0, 1, 1, 1) 
     self.tabWidget.addTab(self.widget, "") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtWidgets.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 17)) 
     self.menubar.setObjectName("menubar") 
     self.menu = QtWidgets.QMenu(self.menubar) 
     self.menu.setObjectName("menu") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtWidgets.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 
     self.actLogin = QtWidgets.QAction(MainWindow) 
     self.actLogin.setCheckable(True) 
     self.actLogin.setObjectName("actLogin") 
     self.menu.addAction(self.actLogin) 
     self.menubar.addAction(self.menu.menuAction()) 

     self.retranslateUi(MainWindow) 
     self.tabWidget.setCurrentIndex(0)#* 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("MainWindow", "Lang-8 小幫手")) 
     self.label.setText(
      _translate("MainWindow", "<html><head/><body><p align=\"center\">E-mail 信箱</p></body></html>")) 
     self.label_2.setText(
      _translate("MainWindow", "<html><head/><body><p align=\"center\">密碼</p></body></html>")) 
     self.btnLogin.setText(_translate("MainWindow", "登入")) 
     self.chxLogin.setText(_translate("MainWindow", "維持我的登入狀態")) 
     self.tbxLoginStatus.setHtml(_translate("MainWindow", 
               "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" 
               "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" 
               "p, li { white-space: pre-wrap; }\n" 
               "</style></head><body style=\" font-family:\'PMingLiU\'; font-size:9pt; font-weight:400; font-style:normal;\">\n" 
               "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">No User Logged In</p></body></html>")) 
     self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "登入")) 
     self.btnSaveSentence.setText(_translate("MainWindow", "儲存")) 
     self.tbxEditStatus.setHtml(_translate("MainWindow", 
               "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n" 
               "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" 
               "p, li { white-space: pre-wrap; }\n" 
               "</style></head><body style=\" font-family:\'PMingLiU\'; font-size:9pt; font-weight:400; font-style:normal;\">\n" 
               "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">-</p></body></html>")) 
     self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "進行修改")) 
     self.label_3.setText(
      _translate("MainWindow", "<html><head/><body><p align=\"center\">標題</p></body></html>")) 
     self.label_4.setText(
      _translate("MainWindow", "<html><head/><body><p align=\"center\">內容</p></body></html>")) 
     self.btnPublish.setText(_translate("MainWindow", "發表")) 
     self.tabWidget.setTabText(self.tabWidget.indexOf(self.widget), _translate("MainWindow", "輸出")) 
     self.menu.setTitle(_translate("MainWindow", "檔案")) 
     self.actLogin.setText(_translate("MainWindow", "Login")) 


if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = QtWidgets.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

首先,所有我已經找到了這個問題的答案似乎是舊的,並專門針對QT4。

他們沒有爲我工作,但我也不太清楚實現它們的上下文是什麼,所以我也不確定問題在於它在QT5中是不同的還是它是上下文的東西(可能都是)。

下面是一個例子:

How does the keyPressEvent method work in this program?

# A key has been pressed! 
def keyPressEvent(self, event): 
    # Did the user press the Escape key? 
    if event.key() == QtCore.Qt.Key_Escape: # QtCore.Qt.Key_Escape is a value that equates to what the operating system passes to python from the keyboard when the escape key is pressed. 
     # Yes: Close the window 
     self.close() 
    # No: Do nothing. 

我已經嘗試使用這一解決方案通過簡單地複製並粘貼到我的Ui_MainWindow類,但沒有任何反應。

這是正確的代碼?如果是這樣,我該如何具體實施?也就是說,我把它放在哪裏?

我完全困惑和迷失。

感謝,

+0

雖然它是爲PyQt4編寫的,[這個問題](https://stackoverflow.com/q/18417384/984421)本來可以解釋如何解決這個問題。唯一的區別是你需要使用'QtWidgets'而不是'QtGui'。您也可以在PyQt5文檔中閱讀[使用Qt Designer](http://pyqt.sourceforge.net/Docs/PyQt5/designer.html)。 – ekhumoro

回答

1

Qt設計提供了一種簡單的方法來創建一個圖形用戶界面,但它只是實現了設計,而不是邏輯,你想要做的任務是邏輯的一部分。爲此,建議使用以前的設計創建一個新類。

要做到這一點,你必須創建一個新文件,它會調用你main.py,它必須與Qt Designer生成的文件位於同一個文件夾中。要使用Qt Designer生成的文件,我會叫它design.py:

. 
├── design.py 
└── main.py 

這個類,你作爲一個模板窗口繼承:QMainWindow中和生成的設計,你必須調用setupUi(),以填補小部件。

from PyQt5 import QtCore, QtGui, QtWidgets 

from design import Ui_MainWindow 

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self, *args, **kwargs): 
     QtWidgets.QMainWindow.__init__(self, *args, **kwargs) 
     self.setupUi(self) 
    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Escape: 
      self.close() 

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    w = MainWindow() 
    w.show() 
    sys.exit(app.exec_()) 
+0

最後,我可以使用關鍵事件!謝謝!對於其他人來說,請確保你從main.py而不是design.py運行,否則一切都將是相同的,除了關鍵事件不會工作。 – Zhiming010