如何将我的QTableWidget子类链接到我的主程序

时间:2015-08-20 12:44:38

标签: python user-interface pyqt subclass qtablewidget

感谢以下帖子(Python Qt: How to catch "return" in qtablewidget),我发现了如何将QTableWidget子类化为连接 ENTER 键事件。我的问题是,从这个子类,我找不到到达所有其他小部件的方法。

这就是我所做的。

使用QtDesigner我使用QTableWidgetTextField构建了这个简单的界面。我将QTableWidget提升为我自己的MyTableWidget(来自上面的帖子)。

主要代码如下:

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)

当我点击表格时,我按预期收到按预期打印的“点击输入”消息。但是我希望能够从这个子类访问GUI的其他小部件....以及variable1中定义的AppTemplateMain

我觉得我错过了一些明显但却无法弄明白的东西。有人可以帮助我吗?

非常感谢。

2 个答案:

答案 0 :(得分:0)

您可以在表格中创建自定义信号,随时随地发出。使用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,因为正如其名称所述,它是一个事件,而不是一个信号。

答案 1 :(得分:0)

谢谢tmoreau,

我刚刚找到了这样做的方法而且在这里(以防其他人像pyqt一样转储)

mytablewidget.py rom 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)