53961


今PysideをMAYAで使用するため、学習しております。  
MAYAウィンドウをmayaMixin.MayaQWidgetBaseMixinにて継承し  
UIをロードし、そのUIパーツの設定を変更することまではできましたが  
UIのパーツ【widget】上で、mousePressEventを実装したいのですが  
関数を記載しても動作せず、悩んでおります。

ゴールとしては、マウスイベントを実装してボタンを矩形選択したいと思っております。

どこか記述が間違っている箇所があるか？ご教授よろしくお願いいたします。

以下使用コードです。UIは下記にコードで記載しております。  
ラベルで記載している画像は適当なものを貼っていました。

現状の実行画像です↓  
[![画像の説明をここに入力](https://i.stack.imgur.com/XcVNW.png)](https://i.stack.imgur.com/XcVNW.png)

[code]

    from PySide.QtCore import *
    from PySide.QtGui import *
    from PySide.QtUiTools import QUiLoader
    from maya.app.general import mayaMixin
    
    class Image(mayaMixin.MayaQWidgetBaseMixin,QDialog):
    
        def __init__(self, parent = None):
            super(Image, self).__init__(parent)
            self.UIPanel = QUiLoader().load("D:/UI.ui")
            self.UIPanel.BackGound.setPixmap(QPixmap("D:/test.jpg"))
            self.UIPanel.pushButton.clicked.connect(self.test)
            self.UIPanel.widget.mousePressEvent = self.mousePressEvent
    
        def mousePressEvent(self, event):
            print "Push"
    
    
        def test(self):
            print "PushButton"
    
    Window = Image()
    Window.UIPanel.show()
    
[/code]

こちら使用したUIファイルです。

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>469</width>
        <height>642</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <widget class="QWidget" name="widget" native="true">
        <property name="geometry">
         <rect>
          <x>10</x>
          <y>10</y>
          <width>451</width>
          <height>611</height>
         </rect>
        </property>
        <widget class="QLabel" name="BackGound">
         <property name="geometry">
          <rect>
           <x>0</x>
           <y>0</y>
           <width>531</width>
           <height>611</height>
          </rect>
         </property>
         <property name="text">
          <string/>
         </property>
         <property name="pixmap">
          <pixmap>test.jpg</pixmap>
         </property>
        </widget>
        <widget class="QPushButton" name="pushButton">
         <property name="geometry">
          <rect>
           <x>154</x>
           <y>280</y>
           <width>91</width>
           <height>51</height>
          </rect>
         </property>
         <property name="text">
          <string>Hellow</string>
         </property>
        </widget>
       </widget>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
     </widget>
     <resources/>
     <connections/>
    </ui>
    
[/code]


CC BY-SA 4.0
2019-04-04T15:20:05.957
53924
2019-04-05T13:34:05.053
2019-04-05T00:57:39.220
3060
32555
question
python pyside
MAYA上でPySide使用時のmousePressEventの有効にする方法


2通りの方法があると考えます。

  1. `QWidget`を継承したクラス(例: `ExtendedWidget`)を定義し、  
それに`mousePressEvent`メソッドを再定義(オーバーライド)する。  
それを「`name="widget"`」のクラスに指定する。  
(uiファイルの「`<widget class="QWidget" name="widget" native="true">`」の箇所)

  2. `QObject`を継承したクラス(例: `EventFilter`)を定義し、  
それに`eventFilter`メソッドを再定義(オーバーライド)する。  
それを「`self.UILabel.widget`」に設定する。  
(参考:
[PySide(PyQt)で.uiから作られたwidgetにeventを追加する](https://qiita.com/toriiico/items/402d454e1aa73f2629af))

[code]     # 2の例:

    class EventFilter(QtCore.QObject):
        def __init__(self, target, parent=None):
            super(EventFilter, self).__init__(parent)
            self.target = target
    
        def eventFilter(self, widget, event):
            if widget == self.target and event.type() == QEvent.MouseButtonPress:
                print "Push"
    
    class Image(mayaMixin.MayaQWidgetBaseMixin,QDialog):
        def __init__(self, parent = None):
            # 中略
            filter = EventFilter(self.UIPanel.widget)
            self.UIPanel.widget.installEventFilter(filter)
    
[/code]

どちらの方法でも実現できると思いますが、一長一短あると考えます。

  * 1の方法の方がシンプルと思いますが、UIファイルをQtCreatorのデザイナで  
「ウィジェットの格上げ」操作で編集する必要があります。

  * 2の方法はUIファイルの編集は不要ですが、実装が複雑になると思います。

以上、参考になれば幸いです。


CC BY-SA 4.0
2019-04-05T13:34:05.053
53961
2019-04-05T13:34:05.053
20098
53924
answer