如何在 window 内对齐 QPushButton?
How to align a QPushButton inside window?
我想将 QPushButton 对齐到右下角,但没有固定大小,因为如果我使用固定大小并调整 window 的大小,它就不再好看了。这是我的代码:
self.copy_btn = QtWidgets.QPushButton(self)
self.copy_btn.setText("Copy")
self.copy_btn.move(370, 350)
如您所见,我目前正在使用 .move()
。我尝试使用 .setAlignment(QtCore.Qt.AlignRight)
,因为它适用于标签,但不适用于 QPushButton。
根据上下文有几种解决方案:
使用 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_())
我想将 QPushButton 对齐到右下角,但没有固定大小,因为如果我使用固定大小并调整 window 的大小,它就不再好看了。这是我的代码:
self.copy_btn = QtWidgets.QPushButton(self)
self.copy_btn.setText("Copy")
self.copy_btn.move(370, 350)
如您所见,我目前正在使用 .move()
。我尝试使用 .setAlignment(QtCore.Qt.AlignRight)
,因为它适用于标签,但不适用于 QPushButton。
根据上下文有几种解决方案:
使用 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_())