QRectが便利な件

     いきなりですが、Qtでウィジェットの大きさや位置を変更するには以下のような方法がメジャーですね。
    # -*- coding:utf-8 -*-
    import sys
    from PySide import QtGui, QtCore
    
    app = QtGui.QApplication(sys.argv)
    widgetA = QtGui.QWidget()
    widgetA.show()
    
    widgetA.move(100, 50)     # ウィジェットの位置を指定
    widgetA.resize(400, 300)  # ウィジェットの大きさを指定
    
    sys.exit(app.exec_())
    

     moveメソッドとresizeメソッドによって位置と大きさを修正出来るわけですが、それ以外の方法としてQRectを用いてsetGeometryすると言う手があります。
    # -*- coding:utf-8 -*-
    import sys
    from PySide import QtGui, QtCore
    
    app = QtGui.QApplication(sys.argv)
    widgetA = QtGui.QWidget()
    widgetA.show()
    
    rect = QtCore.QRect(100, 50, 400, 300)
    widgetA.setGeometry(rect)
    
    sys.exit(app.exec_())
    

     内容は一緒ですが、書き方がだいぶ違いますね。
     今回はこのQRectが便利だったよぉぉぉぉぉぉっ!! ってお話でございます。
     QRectとは、rectangle(矩形:くけい)・・・つまり四角を表してます。
     使用する時は
    QtCore.QRect(x, y, width, height)
    でQRectを作成します。xが矩形の左上X座標、yが左上Y座標、width/heightが矩形の幅/矩形の高さをそれぞれ表しています。

    # -*- coding:utf-8 -*-
    rect = QtCore.QRect(40, 0, 800, 600)
    print(rect.x())                   # 矩形のx座標を取得
    print(rect.y())                   # 矩形のy座標を取得
    print(rect.width())             #矩形の幅を取得
    print(rect.height())            #矩形の高さを取得
    
    rect.setWidth(400)  #矩形の幅を400に設定
    rect.setHeight(300) #矩形の高さを300に設定
    
     こんな感じで幅や高さなんかも変更する事ができます。そして変更後のQRectをウィジェットにsetGeometryすれば、その結果が反映される訳です。
     これだけ聞くと、moveとresizeがいっぺんに出来るだけやん!って思われるかもしれませんが、当然コレ以外に便利な事が色々出来るのが魅力なんどす。

     例えばQRectにはmoveCenterなるメソッドがあります。これは矩形の中心を任意の座標へ移動するメソッドです。
     このメソッドを利用すれば、デスクトップの中心へ移動・・・なんて事も簡単に出来るわけですよ。
    # -*- coding:utf-8 -*-
    import sys
    from PySide import QtGui, QtCore
    
    app = QtGui.QApplication(sys.argv)
    # デスクトップの有効範囲矩形を取得。
    rect = QtGui.qApp.desktop().availableGeometry()
    
    # 矩形の幅・高さを半分に設定。幅・高さを同時に指定する場合はsetSizeが便利。
    rect.setSize(rect.size() / 2)
    # 矩形をデスクトップの中心へ移動
    rect.moveCenter(QtCore.QPoint(rect.width(), rect.height()))
    
    widgetA = QtGui.QWidget()
    widgetA.setGeometry(rect)
    widgetA.show()
    
    sys.exit(app.exec_())
    
     上の例では有効デスクトップの範囲をQRectとして取得し(こちらの詳細はQtでDesktopの情報をゲットするを参照)、幅と高さを半分にしました。
     さらにその値をmoveCenterへ入れて中心地点へとウィジェットを移動させています。
    th_qrect001.jpg
     他にもmoveTopRight(Left)やmoveBottomRight(Left)などもあり、これらを使用すると任意の領域の右端などに簡単に移動する事が出来ます。
    # -*- coding:utf-8 -*-
    import sys
    from PySide import QtGui, QtCore
    
    app = QtGui.QApplication(sys.argv)
    # デスクトップの有効範囲矩形を取得。
    rect = QtGui.qApp.desktop().availableGeometry()
    w = rect.width()
    h = rect.height()
    
    # 矩形の幅・高さを半分に設定。
    rect.setWidth(w / 2)
    rect.setHeight(h / 2)
    # 矩形をデスクトップの右下へ移動。
    rect.moveBottomRight(QtCore.QPoint(w, h))
    
    widgetA = QtGui.QWidget()
    widgetA.setGeometry(rect)
    widgetA.show()
    
    sys.exit(app.exec_())
    
    th_qrect002.jpg

     他には2つの矩形が重なっているかどうかの判定も出来ます。
    from PySide import QtCore
    
    rectA = QtCore.QRect(0, 0, 400, 400)
    rectB = QtCore.QRect(200, 200, 400, 400)
    
    print(rectA.intersects(rectB))
    # >>> True
    
    rectB.moveTopLeft(QtCore.QPoint(401, 0))
    print(rectA.intersects(rectB))
    # >>> False
    


     最後はQRectのintersectedメソッドを利用してこんなお遊びウィジェットを作成〜。
     2つのウィジェットの被っている部分が赤くなるウィジェットでございます。
    # -*- coding:utf-8 -*-
    import sys
    from PySide import QtGui, QtCore
     
    app = QtGui.QApplication(sys.argv)
    
    class TestWidget(QtGui.QWidget):
        def __init__(self, targetWidget, parent=None):
            u'''
            引数targetWidgetで指定したウィジェットと被っているエリアを赤く描画する
            機能を持つWidgetクラス。
            '''
            super(TestWidget, self).__init__(parent)
            self.setWindowTitle('Test Widget')
            self.target_widget = targetWidget
    
        def moveEvent(self, event):
            u'''
            ウィジェット移動時に描画を更新するためのオーバーライド。
            '''
            self.update()
    
        def resizeEvent(self, event):
            u'''
            ウィジェットリサイズ時に描画を更新するためのオーバーライド。
            '''
            self.update()
    
        def paintEvent(self, event):
            u'''
            target_widgetと被っている部分を赤く描画するためのオーバーライド。
            '''
            super(TestWidget, self).paintEvent(event)
            
            # target_widgetと被っている部分のQRectを取得。
            intersected = self.geometry().intersected(
                self.target_widget.geometry()
            )
            
            # 上書きする描画の開始。
            painter = QtGui.QPainter(self)
            painter.setBrush(QtGui.QColor(200, 80, 96))
            
            # 上で取得した被っている部分のQRectの左上の座標はグローバル空間での座標なので
            # 一度mapFromGlobalメソッドでローカル化してから、それをintersectedへセットする。
            local_point = self.mapFromGlobal(intersected.topLeft())
            intersected.moveTopLeft(local_point)
    
            painter.drawRect(intersected)
    
    widgetA = QtGui.QWidget()
    widgetB = TestWidget(widgetA)
    widgetA.show()
    widgetB.show()
     
    sys.exit(app.exec_())
    
    th_qrect003.jpg


     他にも任意の点が矩形に含まれているかどうかを調べる
    contains
     や、4点で矩形を定義する
    adjust
    など、ウィジェットのサイズを調整するのに便利な機能が満載!!!

     これは活用しない手はないっしょ!!!!!
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココからアクセスできますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR