82715


現在、マウスドラッグで長方形を描くことができるアプリをPySide2で記述しています。  
下記のコードはYouTubeで見つけた動画を主に参考にしたものですが、このままではウィンドウを閉じるまで何度でも長方形を描き直すことができます。これを改変して「一度長方形を描き終わった時点で（左クリックを離した時点で）そのままアプリを閉じる」という挙動を実現させたいです。

[code]

    # _*_ coding: utf-8 _*_
    import sys
    from PySide2.QtWidgets import QApplication, QWidget
    from PySide2.QtCore import Qt, QPoint, QRect
    from PySide2.QtGui import QPainter, QPen
    
    class DrawRectangle(QWidget):
    
        def __init__(self):
            super().__init__()
            self.setAttribute(Qt.WA_TranslucentBackground)
            self.setWindowFlags(Qt.FramelessWindowHint)
            self.setStyleSheet("background-color: rgba(0, 0, 0, 170);")
    
            self.setMinimumSize(1920, 1080)
    
            self.xy1, self.xy2 = QPoint(), QPoint()
    
        def paintEvent(self, event):
            painter = QPainter(self)
            painter.fillRect(0, 0, self.width(), self.height(), painter.background())
            if not self.xy1.isNull() and not self.xy2.isNull():
                painter.setPen(QPen(Qt.white, 3, Qt.SolidLine))
                rect = QRect(self.xy1, self.xy2)
                painter.drawRect(rect.normalized())
    
        def mousePressEvent(self, event):
            if event.buttons() & Qt.LeftButton:
                self.xy1 = event.pos()           
                self.xy2 = self.xy1
                print(self.xy1)
                self.update()
    
        def mouseMoveEvent(self, event):
            if event.buttons() & Qt.LeftButton:
                self.xy2 = event.pos()
                print(self.xy2)
                self.update()
    
        def mouseReleaseEvent(self, event):
            if event.buttons() & Qt.LeftButton:
                rect = QRect(self.xy1, self.xy2)
                painter = QPainter(self)
                painter.drawRect(rect.normalized())
    
                self.xy1, self.xy2 = QPoint(), QPoint()
                self.update()
    
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        myapp = DrawRectangle()
        myapp.show()
        try:
            sys.exit(app.exec_())
        except SystemExit:
            print('closing the window...')
    
[/code]

mouseReleaseEventの最後に何かアプリを終了するための文言を記述すれば上記の挙動が実現できるものと考え、tkinterでいうところのdestroy()に相当すると思われるself.close()をself.update()の直後に加筆してみましたが、特に加筆前と違う動作をしている様子は見られませんでした。

この場合、どこに何を書くのが正しいのか教えていただけると幸いです。


CC BY-SA 4.0
2021-09-27T06:46:54.050
82713
2021-09-27T08:38:30.163
2021-09-27T08:08:51.747
48377
48377
question
python pyside
PySide2のmouseReleaseEventでウィンドウを閉じたい


`mouseReleaseEvent`を下記のように書き換えると見込み通りに動作します。

修正前の[`event.buttons()`](https://doc.qt.io/qt-5/qmouseevent.html#buttons)は、右ボタンや中ボタンを含む
**全ボタンの状態** を返します。  
例えば`int(event.buttons())`のコードを通った時点で、左ボタンのみ押されていれば`1(0b01)`を、右ボタンのみ押されていれば`2(0b10)`を、両方のボタンが押されていれば`3(0b11)`を返します。  
逆に言うと`event.buttons()`のコードを **通った時点で**
左ボタンがReleaseされた状態だと`0b01`を返さないため、ご質問のコードの`mouseReleaseEvent`ではif文の中を通りません。  
ちなみにご質問のコードでは「左ボタンを押し続けたまま右ボタンをクリックする」と、`int(event.buttons())`は`0b01`を返すので見込み通りの動作になります。

特に理由がなければ[`event.button()`](https://doc.qt.io/qt-5/qmouseevent.html#button)イベントに書き換えることで、`
== Qt.LeftButton`の比較により押されたボタンを判定することが可能です。

[code]

        def mouseReleaseEvent(self, event):
            #if event.buttons() & Qt.LeftButton:
            if event.button() == Qt.LeftButton:
                rect = QRect(self.xy1, self.xy2)
                painter = QPainter(self)
                painter.drawRect(rect.normalized())
    
                self.xy1, self.xy2 = QPoint(), QPoint()
                #self.update()
                self.close()
    
[/code]


CC BY-SA 4.0
2021-09-27T07:21:32.057
82715
2021-09-27T08:38:30.163
2021-09-27T08:38:30.163
9820
9820
82713
answer