如何 link 我的 QTableWidget 子类到我的主程序
How to link my QTableWidget subclass to my main program
感谢以下 post (Python Qt: How to catch "return" in qtablewidget) 我找到了如何继承 QTableWidget
以连接 ENTER 键事件。我的问题是,从这个子类,我找不到到达所有其他小部件的方法。
这是我所做的。
我使用 QtDesigner 使用 QTableWidget
和 TextField
构建了这个简单的界面。我将 QTableWidget
提升为我自己的 MyTableWidget
(从上面的 post)。
主要代码如下:
import sys
from PyQt4 import QtGui, QtCore, Qt
from my_interface import Ui_MainWindow
class AppTemplateMain(QtGui.QMainWindow):
variable1 = 'my variable 1'
#initialize app
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
myapp = AppTemplateMain()
myapp.show()
exit_code=app.exec_()
sys.exit(exit_code)
并且 QTableWidget
的子类在它自己的文件中定义 mytablewidget.py
from PyQt4 import QtGui
from PyQt4.QtCore import Qt
class MyTableWidget(QtGui.QTableWidget):
def __init__(self, parent=None):
self.parent = parent
super(MyTableWidget, self).__init__(parent)
def keyPressEvent(self, event):
key = event.key()
if key == Qt.Key_Return or key == Qt.Key_Enter:
print('clicked enter')
else:
super(MyTableWidget, self).keyPressEvent(event)
当我单击 table 时,我得到了预期的消息 'clicked enter'。但是我想从这个子类访问 GUI 的其他小部件......以及 AppTemplateMain
中定义的 variable1
。
我觉得我遗漏了一些明显的东西,但又想不通是什么。有人可以帮我吗。
非常感谢。
您可以在 table 中创建一个自定义信号,您可以随时发出。使用 new style signal and slots:
class MyTableWidget(QtGui.QTableWidget):
myCustomSignal=pyqtSignal()
def keyPressEvent(self, event):
key = event.key()
if key == Qt.Key_Return or key == Qt.Key_Enter:
print('clicked enter')
self.myCustomSignal.emit()
...
在您的主代码中,您连接到此信号:
self.ui.tableWidget.myCustomSignal(self.myFunction)
您不能直接连接到 keyPressEvent
,因为正如其名称所述,它是一个事件,而不是信号。
谢谢 tmoreau,
我刚刚找到了方法,就在这里(以防其他人像我一样使用 pyqt 转储)
mytablewidget.py
从 PyQt4 导入 QtGui
从 PyQt4.QtCore 导入 Qt
class MyTableWidget(QtGui.QTableWidget):
parent = None
def __init__(self, parent=None):
self.parent = parent
super(MyTableWidget, self).__init__(parent)
def keyPressEvent(self, event):
key = event.key()
if key == Qt.Key_Return or key == Qt.Key_Enter:
print('clicked enter')
else:
super(MyTableWidget, self).keyPressEvent(event)
def setUI(self, ui_parent):
self.ui = ui_parent
和里面 main.py
导入系统
从 PyQt4 导入 QtGui、QtCore、Qt
从 my_interface 导入 Ui_MainWindow
class AppTemplateMain(QtGui.QMainWindow):
variable1 = 'my variable 1'
#initialize app
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.tableWidget.setUI(self)
if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
myapp = AppTemplateMain()
myapp.show()
exit_code=app.exec_()
sys.exit(exit_code)
感谢以下 post (Python Qt: How to catch "return" in qtablewidget) 我找到了如何继承 QTableWidget
以连接 ENTER 键事件。我的问题是,从这个子类,我找不到到达所有其他小部件的方法。
这是我所做的。
我使用 QtDesigner 使用 QTableWidget
和 TextField
构建了这个简单的界面。我将 QTableWidget
提升为我自己的 MyTableWidget
(从上面的 post)。
主要代码如下:
import sys
from PyQt4 import QtGui, QtCore, Qt
from my_interface import Ui_MainWindow
class AppTemplateMain(QtGui.QMainWindow):
variable1 = 'my variable 1'
#initialize app
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
myapp = AppTemplateMain()
myapp.show()
exit_code=app.exec_()
sys.exit(exit_code)
并且 QTableWidget
的子类在它自己的文件中定义 mytablewidget.py
from PyQt4 import QtGui
from PyQt4.QtCore import Qt
class MyTableWidget(QtGui.QTableWidget):
def __init__(self, parent=None):
self.parent = parent
super(MyTableWidget, self).__init__(parent)
def keyPressEvent(self, event):
key = event.key()
if key == Qt.Key_Return or key == Qt.Key_Enter:
print('clicked enter')
else:
super(MyTableWidget, self).keyPressEvent(event)
当我单击 table 时,我得到了预期的消息 'clicked enter'。但是我想从这个子类访问 GUI 的其他小部件......以及 AppTemplateMain
中定义的 variable1
。
我觉得我遗漏了一些明显的东西,但又想不通是什么。有人可以帮我吗。
非常感谢。
您可以在 table 中创建一个自定义信号,您可以随时发出。使用 new style signal and slots:
class MyTableWidget(QtGui.QTableWidget):
myCustomSignal=pyqtSignal()
def keyPressEvent(self, event):
key = event.key()
if key == Qt.Key_Return or key == Qt.Key_Enter:
print('clicked enter')
self.myCustomSignal.emit()
...
在您的主代码中,您连接到此信号:
self.ui.tableWidget.myCustomSignal(self.myFunction)
您不能直接连接到 keyPressEvent
,因为正如其名称所述,它是一个事件,而不是信号。
谢谢 tmoreau,
我刚刚找到了方法,就在这里(以防其他人像我一样使用 pyqt 转储)
mytablewidget.py 从 PyQt4 导入 QtGui 从 PyQt4.QtCore 导入 Qt
class MyTableWidget(QtGui.QTableWidget):
parent = None
def __init__(self, parent=None):
self.parent = parent
super(MyTableWidget, self).__init__(parent)
def keyPressEvent(self, event):
key = event.key()
if key == Qt.Key_Return or key == Qt.Key_Enter:
print('clicked enter')
else:
super(MyTableWidget, self).keyPressEvent(event)
def setUI(self, ui_parent):
self.ui = ui_parent
和里面 main.py
导入系统 从 PyQt4 导入 QtGui、QtCore、Qt 从 my_interface 导入 Ui_MainWindow
class AppTemplateMain(QtGui.QMainWindow):
variable1 = 'my variable 1'
#initialize app
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.tableWidget.setUI(self)
if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
myapp = AppTemplateMain()
myapp.show()
exit_code=app.exec_()
sys.exit(exit_code)