【问题标题】:How to align a QPushButton inside window?如何在窗口内对齐 QPushButton?
【发布时间】:2020-09-23 19:08:00
【问题描述】:

我想将 QPushButton 与右下角对齐,但没有固定大小,因为如果我使用固定大小并调整窗口大小,它就不再好看了。这是我的代码:

    self.copy_btn = QtWidgets.QPushButton(self)
    self.copy_btn.setText("Copy")
    self.copy_btn.move(370, 350)

如您所见,我目前使用的是.move()。我用.setAlignment(QtCore.Qt.AlignRight)试了一下,因为它对标签有效,但对QPushButton无效。

【问题讨论】:

  • 我的直觉是,由于您的问题不清楚,您希望按钮始终位于窗口的左上角。我的直觉正确吗?
  • @eyllanesc 是的,你是对的,但它实际上是右下角。

标签: python pyqt pyqt5 alignment qpushbutton


【解决方案1】:

根据上下文有几种解决方案:

  • 使用 QXBoxLayout

    from PyQt5 import QtCore, QtWidgets
    
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.copy_btn = QtWidgets.QPushButton()
            self.copy_btn.setText("Copy")
    
            lay = QtWidgets.QVBoxLayout(self)
            lay.setContentsMargins(0, 0, 0, 0)
            lay.addStretch()
            lay.addWidget(self.copy_btn, alignment=QtCore.Qt.AlignRight)
    
            # or
            # lay = QtWidgets.QHBoxLayout(self)
            # lay.setContentsMargins(0, 0, 0, 0)
            # lay.addStretch()
            # lay.addWidget(self.copy_btn, alignment=QtCore.Qt.AlignBottom)
    
            self.resize(640, 480)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
    
        w = Widget()
        w.show()
    
        sys.exit(app.exec_())
    
  • 使用事件过滤器

    from PyQt5 import QtCore, QtWidgets
    
    
    class Resizer(QtCore.QObject):
        def __init__(self, widget):
            super().__init__(widget)
    
            self._widget = widget
    
            self.widget.installEventFilter(self)
            if not self.widget.isWindow():
                self.widget.window().installEventFilter(self)
    
        @property
        def widget(self):
            return self._widget
    
        def eventFilter(self, obj, event):
            if obj is self.widget and not self.widget.isWindow():
                if event.type() == QtCore.QEvent.ParentAboutToChange:
                    self.widget.window().removeEventFilter(self)
                elif event.type() == QtCore.QEvent.ParentChange:
                    self.widget.window().installEventFilter(self)
    
            if obj is self.widget.window() and event.type() == QtCore.QEvent.Resize:
                geom = self.widget.geometry()
                geom.moveBottomRight(QtCore.QPoint(event.size().width(), event.size().height()))
                self.widget.setGeometry(geom)
            return super().eventFilter(obj, event)
    
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.copy_btn = QtWidgets.QPushButton(self)
            self.copy_btn.setText("Copy")
    
            resizer = Resizer(self.copy_btn)
            self.resize(640, 480)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
    
        w = Widget()
        w.show()
    
        sys.exit(app.exec_())
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多