2010-08-21 185 views
2

我有一個Widget(QTabeleWidget,QLabels和一些QButtons)。它是在Qt-Designer中構建的。現在我必須執行一些事情。爲此,我需要mousePressEvent。 通常我會寫一個子類,寫這樣的事:如何在PyQt中爲Qt-Designer構件實現MousePressEvent

def mousePressEvent(self, event): 
    if event.button() == Qt.LeftButton: 
     print "left" 
    else: 
     print 'right' 

但我不知道怎麼做,在設計器中創建一個Widget。 我需要它爲QTabeleWidget。希望可以有人幫幫我。我試圖在谷歌的幫助下解決問題,但沒有成功。 這個網站幫了我很多次,所以我想我會試試看。

回答

3

隨着PyQt的有三種不同的方式與設計師創建形式的工作:

  1. 使用單繼承,使表單變量成員
  2. 使用多重繼承
  3. 動態生成直接從會員在UI文件

單繼承

class MyTableWidget(QTableWidget): 
    def __init__(self, parent, *args): 
     super(MyTableWidget, self).__init__(parent, args) 
     self.ui = YourFormName() 
     self.ui.setupUi(self) 
     # all gui elements are now accessed through self.ui 
    def mousePressEvent(self, event): 
     pass # do something useful 

多重繼承

class MyTableWidget(QTableWidget, YourFormName): 
    def __init__(self, parent, *args): 
     super(MyTableWidget, self).__init__(parent, args) 
     self.setupUi(self) 
     # self now has all members you defined in the form 
    def mousePressEvent(self, event): 
     pass # do something useful 

動態生成

from PyQt4 import uic 
yourFormTypeInstance = uic.loadUi('/path/to/your/file.ui') 

對於上述(3),你將與你指定的任何基本類型的實例結束爲你的形式。您可以根據需要覆蓋您的mousePressEvent

我建議你看看PyQt4 reference manual中的section 13.1。第13.2節討論了uic模塊。

+0

謝謝你的回答。我試過了,但它不起作用。 如果我點擊窗口,而不是一個小部件,那麼它會觸發。 mousePressEvent的作品。但是如果我點擊QTableWidget或QLabel,mousePressEvent不會被執行。 例如,如果我想從QTableWidget itemSelectionChanged信號,然後我寫: 「def on_myTable_itemSelectionChanged(self):」「 所以我正在尋找相當於mousePressEvent的東西。 希望我的解釋不壞。 – user427305 2010-08-22 00:03:35

+0

自動佈線存在的信號,但不是事件。當你子類化並實現'mousePressEvent'時,你會收到給定小部件的事件,但只能接收小孩不接受事件的事件。由於小部件中有小部件,因此每個小部件都在父級看到它之前接收並處理該事件。當沒有相關信號時,處理這個問題的一個好方法是使用'installEventFilter'安裝一個事件過濾器。 – 2010-08-22 04:20:44

+0

謝謝!它適用於installEventFilter。這就是我一直在尋找的。 – user427305 2010-08-22 10:23:26