0

我有一个应用程序,其中包含许多带有样式表的小部件,但是,我没有向界面添加任何布局,它也没有包含中央小部件,但是应用程序运行时没有任何问题。

但是,每当我尝试调整应用程序的大小(缩小)时,小部件当然不会缩放。

我进行了一些研究(因为我找不到与我的问题相关的任何其他内容),我在 Qt 文档、样式表参考中找到了这个:

“绘制的实际图像是使用与 QIcon 相同的算法确定的(即)图像永远不会按比例放大,但在必要时总是按比例缩小。”

如何使样式表随窗口缩小?(如果样式表有背景图片)


例如,我有带有样式表的按钮:

btn = QtGui.QPushButton(self)
btn.move(0, 0)
btn.setObjectName('btn)
btn.setStyleSheet("#btn {background-image: url(':/images/somepicture.png'); border: none; }")

我怎样才能使这个按钮随着窗口缩小,我可以在没有布局的情况下实现这个吗?如果不是,我该如何使用布局?(没有限制太多)

4

1 回答 1

1

如果您将按钮作为中央小部件添加到 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 的边距。QLayoutsl.setContentsMargins(50,50,50,50)

于 2016-05-22T10:58:03.893 回答