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 поле вокруг кнопки.