PyQt:我如何在缩放模式下设置样式表内容?

时间:2016-05-20 18:20:37

标签: python pyqt qstylesheet

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

然而,每当我试图调整应用程序的大小(缩小它)时,小部件当然不会扩展。

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

  

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

如何使用窗口缩小样式表? (如果样式表上有背景图像)

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

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

如何使用窗口缩小此按钮,我可以在没有布局的情况下实现此目的吗?如果不是我怎么能用布局呢? (没有限制太多)

1 个答案:

答案 0 :(得分:1)

如果您将按钮作为中心窗口小部件添加到QMainWindow,则应自动调整其大小以适合可用空间。但是,要使按钮图像按比例缩放,您需要将图像设置为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分配给特定小部件,您只需通过.setStyleSheet()传递CSS规则。

您无法在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 coords采用) :

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上的QLayouts,例如l.setContentsMargins(50,50,50,50)会在按钮周围放置50px的边距。