5

彼は、主にウィジェットなどを移動するための方法論の組み合わせがいくつもあるために、私を何年も悩ませてきました。基本的に、アプリの特定の領域にポップアップできるようにしたい単純なウィジェットがあります。問題は、必要な場所にポップアップするように見えないことです。さらに、アプリの左上にあるウィジェットと、たとえば下にあるウィジェットを指すようにポップアップするかどうかに基づいて、「ポインター」側を調整できるように設定したいと思います。右。

理想的には、ポップアップを親ウィジェットの端にほぼ隣接させて配置し、それがどこにあるかに基づいて固定することができます。これが私が試してきたことです。

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class popup(QWidget):
    def __init__(self, parent = None, widget=None):    
        QWidget.__init__(self, parent)
        layout = QGridLayout(self)
        button = QPushButton("Very Interesting Text Popup. Here's an arrow   ^")
        layout.addWidget(button)
        self.move(widget.rect().bottomLeft())

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.button = QPushButton('Hit this button to show a popup', self)
        self.button.clicked.connect(self.handleOpenDialog)
        self.button.move(250, 50)
        self.resize(600, 200)

    def handleOpenDialog(self):
        self.popup = popup(self, self.button)
        self.popup.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

このコードは、ウィジェットの中央にランダムにボタンを生成します。私が取得しようとしているのは、この例では、ポップアップボタンの矢印がウィジェットの右下隅を指すように、右上に「ピボット」があるボタンの下に表示するポップアップです。ただし、代わりにウィンドウの左上にポップアップしています。.move や .setGeometry をいじったり、QRect をいじったりしても、一生これを理解することはできません。手を貸してくれる人は誰でも大歓迎です。ありがとう!

4

2 に答える 2

3

これが古いことは知っていますが、最近これを探していたので、これが最良の答えです。便利な追加があります(このレシピを探している他の人のために!)

私はそれをミックスインとして実装しました。これにより、ダイアログの柔軟性が向上すると思います。

class PopupDialogMixin(object):  # will not work (with PySide at least) unless implemented as 'new style' class. I.e inherit from object
    def makePopup(callWidget):
        """
        Turns the dialog into a popup dialog.
        callWidget is the widget responsible for calling the dialog (e.g. a toolbar button)
        """
        self.setContentsMargins(0,0,0,0)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.Popup)
        self.setObjectName('ImportDialog')

        # Move the dialog to the widget that called it
        point = callWidget.rect().bottomRight()
        global_point = callWidget.mapToGlobal(point)
        self.move(global_point - QtCore.QPoint(self.width(), 0))

カスタム ダイアログは、QtCore.QDialogとの両方から継承されPopupDialogMixinます。これにより、ダイアログを「通常の」方法で使用するか、ポップアップ ダイアログにするかを選択できます。例えば:

dlg = MyDialog(self)
dlg.makePopup(self.myButton)

ミックスインとして実装すると、多くの利点が得られると思います。

  • ポップアップとして表示するカスタム ダイアログごとに「ポップアップ」コードを記述する必要はありません。
  • ダイアログの「デフォルト」の動作は保持されます。たとえば、「通常の」ダイアログとして別の場所で再利用したい場合は、通常どおりに使用してください。
  • __init__以外に余分なものを渡す必要はありませんparent
于 2014-07-25T10:12:10.047 に答える
1

ここに行きます-コメントはその背後にあるロジックを説明します-質問は例であり、配置についてなので、ポップアップクラスを除いてコードの残りの部分は同じままにしましたが、それはちょっとしたことです-あなた*(これまで)をインポートするべきではありませんが、特にPyQt4.QtCore / QtGui ...

    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    import sys

    class popup(QWidget):
        def __init__(self, parent = None, widget=None):    
            QWidget.__init__(self, parent)
            layout = QGridLayout(self)
            button = QPushButton("Very Interesting Text Popup. Here's an arrow   ^")
            layout.addWidget(button)

            # adjust the margins or you will get an invisible, unintended border
            layout.setContentsMargins(0, 0, 0, 0)

            # need to set the layout
            self.setLayout(layout)
            self.adjustSize()

            # tag this widget as a popup
            self.setWindowFlags(Qt.Popup)

            # calculate the botoom right point from the parents rectangle
            point        = widget.rect().bottomRight()

            # map that point as a global position
            global_point = widget.mapToGlobal(point)

            # by default, a widget will be placed from its top-left corner, so
            # we need to move it to the left based on the widgets width
            self.move(global_point - QPoint(self.width(), 0))

    class Window(QWidget):
        def __init__(self):
            QWidget.__init__(self)
            self.button = QPushButton('Hit this button to show a popup', self)
            self.button.clicked.connect(self.handleOpenDialog)
            self.button.move(250, 50)
            self.resize(600, 200)

        def handleOpenDialog(self):
            self.popup = popup(self, self.button)
            self.popup.show()

    if __name__ == '__main__':
        app = QApplication(sys.argv)
        win = Window()
        win.show()
        sys.exit(app.exec_())
于 2012-08-20T18:07:50.353 に答える