如果您将按钮作为中央小部件添加到 aQMainWindow
它应该自动调整其大小以适应可用空间。但是,要使按钮图像按比例缩放,您需要将图像设置为border-image
样式表属性(有点奇怪)。PyQt4 的一个工作示例:
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
btn = QtGui.QPushButton(self)
btn.setStyleSheet("border-image: url('somepicture.png');") # Scaled
#btn.setStyleSheet("background-image: url('somepicture.png');") # Not scaled
self.setCentralWidget(btn)
self.show()
app = QtGui.QApplication([])
window = MainWindow()
app.exec_()
请注意,您无需设置 id ( objectName
) 即可将 CSS 分配给特定的小部件,您只需通过 . 传入 CSS 规则即可.setStyleSheet()
。
您无法设置布局,QMainWindow
因为它已经有一个复杂的布局系统来容纳停靠小部件和工具栏。因此,如果要使用布局向窗口添加多个小部件,则需要使用容器小部件来容纳它。以下工作示例演示了这一点:
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
w = QtGui.QWidget() # container widget
l = QtGui.QVBoxLayout() # your layout
w.setLayout(l) # set the layout on your container widget
btn = QtGui.QPushButton(self)
btn.setStyleSheet("border-image: url('somepicture.png');")
label = QtGui.QLabel('Hello!')
l.addWidget(btn) # add your widget to the layout
l.addWidget(label) # add the label to the layout
self.setCentralWidget(w) # add the container widget to the QMainWindow
self.show()
app = QtGui.QApplication([])
window = MainWindow()
app.exec_()
如果您希望能够绝对定位小部件,而不是将它们添加到布局(这将控制它们的大小/位置),您可以在创建它时传递父元素(相对于 x,y 坐标):
from PyQt4 import QtGui, QtCore
class MainWindow(QtGui.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
w = QtGui.QWidget() # container widget
btn = QtGui.QPushButton(w)
btn.move(100,100)
btn.setStyleSheet("border-image: url('somepicture.png');")
self.setCentralWidget(w) # add the container widget to the QMainWindow
self.show()
app = QtGui.QApplication([])
window = MainWindow()
app.exec_()
但是绝对像这样定位一个小部件会失去自动缩放它以适应父小部件的能力。如果您只想在窗口中的元素周围设置一些填充/间距,请查看,例如将.setContentsMargins
在按钮周围放置 50px 的边距。QLayouts
l.setContentsMargins(50,50,50,50)