PyQt: Как я могу установить содержимое таблицы стилей в режиме масштабирования?

У меня было приложение, которое содержало много виджетов с таблицей стилей на них, однако я не добавлял никакого макета в интерфейс, он также не включал центральный виджет, но приложение работало без проблем.

Однако всякий раз, когда я пытался изменить размер приложения (уменьшая его размер), виджеты, конечно, не масштабировались.

У меня было небольшое исследование (потому что я не смог найти ничего другого, связанного с моей проблемой), и я нашел это в документации Qt, ссылка на таблицу стилей:

"Фактическое изображение, которое рисуется, определяется с использованием того же алгоритма, что и QIcon (то есть) изображение никогда не масштабируется, а всегда уменьшается при необходимости".

Как я могу уменьшить таблицу стилей с помощью окна? (Если таблица стилей имеет фоновое изображение)


Например, у меня есть кнопка с таблицей стилей:

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

Как я могу уменьшить размер этой кнопки с помощью окна, могу ли я добиться этого без макетов? Если нет, то как я могу сделать это с макетами? (без слишком большого ограничения)

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_()

Обратите внимание, что вам не нужно устанавливать идентификатор (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 на QLayoutsнапример, l.setContentsMargins(50,50,50,50) поместит 50px поле вокруг кнопки.

Другие вопросы по тегам