2015-08-20 1 views
0

Благодаря следующему сообщению (Python Qt: How to catch "return" in qtablewidget) я нашел, как подкласс QTableWidget для подключения ENTER ключевого события. Моя проблема заключается в том, что из этого подкласса я не могу найти способ охватить все другие виджеты.Как связать мой QTableWidget подкласс моей основной программы

Вот что я сделал.

Использование QtDesigner Я построил этот простой интерфейс с QTableWidget и TextField. Я повысил 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.

Я чувствую, что у меня что-то не хватает, но не могу понять, что. Может кто-то мне помочь здесь.

Большое спасибо.

+0

Где вы создаете таблицу в основной код? Вы можете создать пользовательский сигнал в таблице, который выдается в keyPressEvent, и подключить этот сигнал к функции в главном коде. – Mel

+0

Кроме того, я не уверен, что вы хотите создать переменную 1, как это. Сейчас это статическая переменная, которая имеет особое поведение. См. Два первых ответа на этот вопрос: http: // stackoverflow.com/questions/68645/static-class-variables-in-python – Mel

+0

Я попытался создать свой собственный keyPressEvent вот так: QtCore.QObject.connect (self.ui.tableWidget, QtCore.SIGNAL ("keyPressEvent()"), self .myYo) def мойYo (сам, мероприятие): печать ("мой лет") Без успеха! –

ответ

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, потому что, как указано в его названии, это событие, не сигнал.

+0

О да! Я забыл об этом. это было бы даже лучше, чем мое решение. Спасибо tmoreau, мне это нравится! –

0

Благодаря tmoreau,

Я только что нашел способ сделать это и здесь (в случае, если некоторые другие люди, как свалка, как меня с PyQt)

mytablewidget.py ПЗУ 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

импорт SYS из 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) 
+0

Использование ссылки на родителя - это еще один способ сделать это, используя метод 'parent()' таблицы. Вам не нужно делать 'self.parent = parent', и вам действительно не нужна функция' setUI'. – Mel

+0

В виджетах таблицы уже есть основное окно как его родительский элемент (т. Е. В '__init__'). Поэтому вы можете просто выполнить 'print (self.parent(). Variable1)', и он будет работать. Дополнительный код не требуется. – ekhumoro

+0

На самом деле не потому, что я продвигал QTablewidget в myTableWidget внутри QtDesigner ... это означает, что родитель - сам виджет. использование setUI было единственным способом вернуть ссылку на функцию main.py. –