【问题标题】:How to link my QTableWidget subclass to my main program如何将我的 QTableWidget 子类链接到我的主程序
【发布时间】:2015-11-14 02:49:55
【问题描述】:

感谢以下帖子 (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 的其他小部件......以及在AppTemplateMain 中定义的variable1

我觉得我错过了一些明显的东西,但不知道是什么。有人可以在这里帮助我。

非常感谢。

【问题讨论】:

  • 您在主代码中的何处创建表?您可以在表格中创建一个自定义信号,在 keyPressEvent 中发出,然后将此信号连接到主代码中的函数。
  • 另外,我不确定你想像这样创建 variable1。现在它是一个静态变量,具有特定的行为。请参阅此问题的两个第一个答案:stackoverflow.com/questions/68645/…
  • 我尝试像这样创建自己的 keyPressEvent:QtCore.QObject.connect(self.ui.tableWidget,QtCore.SIGNAL("keyPressEvent()"), self.myYo) def myYo(self, event): print("my yo") 没有成功!

标签: python user-interface pyqt subclass qtablewidget


【解决方案1】:

您可以在表格中创建自定义信号,随时发出。使用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,我喜欢!
【解决方案2】:

谢谢 tmoreau,

我刚刚找到了方法,就在这里(以防其他人像我一样使用 pyqt)

mytablewidget.py rom PyQt4 导入 QtGui 从 PyQt4.QtCore 导入 Qt

类 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)

【讨论】:

  • 使用对父级的引用是另一种方法,使用表的方法parent()。你不需要self.parent=parent,你真的不需要setUI函数。
  • 表格小部件已经将主窗口设置为其父窗口(即在__init__ 中)。所以你可以做print(self.parent().variable1),它就可以工作。不需要额外的代码。
  • 不是因为我在 QtDesigner 中将 QTablewidget 提升为 myTableWidget ...这意味着,父级就是小部件本身。使用 setUI 是我获得对 main.py 函数的引用的唯一方法。
  • @jeanBilheux。不会。推广小部件不会有任何区别。所发生的只是在 ui 模块的底部添加了一个导入行,并将QTablewidget 替换为myTableWidget。提升的小部件的父级将是传递给setupUi 的对象(即主窗口)。小部件提升被设计为完全透明 - 唯一改变的是类名。
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多