【问题标题】:Have 2 pyqt buttons move synchronized when mouse moves鼠标移动时有 2 个 pyqt 按钮同步移动
【发布时间】:2023-03-08 08:23:01
【问题描述】:

我目前正在制作一个用户选择图像 qpushbutton 的程序。我已经在按钮类中取代了 mouseMoveEvent、mousePressEvent 和 mouseReleaseEvent 以获得可移动按钮。按钮当前正在独立移动,但我希望按钮移动以使它们之间的水平距离保持不变。

所以目前我有伪代码:

导入东西
将 mvbutton 导入为 mv

类MasterClass(QWidget):
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        #更多设置、布局等
        self.addbutton(图像,名称,大小)
    默认添加按钮(#args):
        self.button=mv.dragbutton(#args)
        #更多设置
        #现在重命名,以便每个按钮都有自己的名称
        如果名称==“名称1”:
            self.name1=self.button
        别的:
            self.name2=self.button
        self.button=""
    #更多代码设置

我取代了拖动按钮类中的鼠标移动/按下/释放功能。因此,我不能在那里引用新的self.name#。所以我的拖动按钮类中的self.move(pos) 无法获得self.name#,因为它是一个不同的自我。关于如何让它发挥作用的任何想法?谢谢。

【问题讨论】:

  • 您是否尝试过将两个按钮添加到一个小部件,而不是移动单个按钮.. 只需移动小部件。此外,在小部件中将按钮添加到布局时,只需定义间距。这样,水平间距将保持不变。
  • 是的,我将让他们将按钮间隔设定的数量。我会试试 Qwidget 方法。
  • 我将如何实现这个?我从来不需要这样做。我应该只创建一个 QWidget 类并将按钮附加到该小部件吗?我不确定我会怎么做。
  • @smitkpatel,我会设置一个 QWidget,然后将按钮嵌入到该 QWidget 中(如果是,如何?)。

标签: python qt python-2.7 pyqt


【解决方案1】:

在尝试了解您的要求后做了一些非常粗糙的事情。 希望这会有所帮助。

编辑

试图提高移动的准确性。不会进行实时移动,因为它存在滞后和更新问题。我想搬家不会再紧张了。

from PyQt4 import QtGui
import sys
class MultiButton(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        QtGui.QWidget.__init__(self, *args, **kwargs)
        self._b1 = QtGui.QPushButton("B1")
        self._b2 = QtGui.QPushButton("B2")
        self._arrangeWidgets()
        self.setStyleSheet("background-color: rgb(0, 0, 0);\n"+\
                           "color: rgb(255, 255, 255);\n"+\
                           "border:1px solid #7F462C ;\n")
        self._moveStart = False
        self._startX = 0
        self._startY = 0

    def _arrangeWidgets(self):
        layout = QtGui.QHBoxLayout()
        layout.addWidget(self._b1)
        #horizontal spacing remains constant now
        layout.addSpacing(90)
        layout.addWidget(self._b2)
        self.setLayout(layout)

    def mousePressEvent(self,event):
        self._moveStart = True 
        self._startX = event.pos().x() - self.pos().x()
        self._startY = event.pos().y() - self.pos().y()
        return QtGui.QWidget.mousePressEvent(self, event)
    

    def mouseReleaseEvent(self, event):
        if self._moveStart:
            self.setGeometry(event.pos().x() - self._startX,event.pos().y() - self._startY,self.width(),self.height())
            self._moveStart = False
            self._startX = 0
            self._startY = 0
            
        return QtGui.QWidget.mouseReleaseEvent(self, event)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    wd = QtGui.QMainWindow()
    wd.resize(500,500)
    mb = MultiButton()
    mb.setFixedSize(200,50)
    wd.setCentralWidget(mb)
    wd.show()
    sys.exit(app.exec_())

这里的 MultiButton 小部件移动两个按钮,使两个按钮之间的水平间距始终保持不变。

【讨论】:

  • 这行得通,但有点紧张。我仍然标记为正确,因为它回答了我的问题。
  • 是的,这就是为什么我提到它只是一个粗略的草图
  • 实际上,我想看看我或其他人能否找到更好的答案,因为这并不像我希望的那样顺利。
猜你喜欢
  • 2013-10-12
  • 2020-09-04
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多