如何让 PyQt/PySide QLinearGradient 一直在中间?
How to keep in PyQt/PySide QLinearGradient always in the middle?
我正在尝试构建一些 UI 具有特定于背景的设计,我想知道您如何使 QLinearGradient 始终位于中间?
如果你只设置一个像 QLinearGradient(0, 0, 700, 0) 这样的数字,即使 window 将被调整大小,它也会保持在同一个位置,这是不希望的...
这里是测试代码:
from PySide2.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QApplication
from PySide2.QtGui import QLinearGradient, QPalette, QColor, QBrush
from PySide2.QtCore import Qt
class MainWindow(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent=parent)
self.setWindowFlags(Qt.Window)
self.setObjectName('Test')
self.setWindowTitle('Test')
self.mainLayout = QVBoxLayout()
self.find_line = QLineEdit()
self.replace_line = QLineEdit()
self.setLayout(self.mainLayout)
self.rename_button = QPushButton('test button')
self.h_layout_a = QHBoxLayout()
law_grad_col = self.lawrencium_gradiant_color()
self.setting_ui(set_colour=law_grad_col)
self.create()
def setting_ui(self, set_colour=None, **kwargs):
self.setPalette(set_colour)
self.resize(300, 50)
def lawrencium_gradiant_color(self, **kwargs):
p = QPalette()
gradient = QLinearGradient(0, 0, 700, 0)
gradient.setColorAt(0.0, QColor(15, 12, 41))
gradient.setColorAt(0.5, QColor(48, 43, 99))
gradient.setColorAt(1.0, QColor(36, 36, 62))
p.setBrush(QPalette.Window, QBrush(gradient))
return p
def create(self, **kwargs):
find = 'Find'
replace = 'Replace'
self.find_line.setPlaceholderText(find)
self.replace_line.setPlaceholderText(replace)
self.mainLayout.addLayout(self.h_layout_a)
self.h_layout_a.addWidget(self.find_line)
self.h_layout_a.addWidget(self.replace_line)
self.h_layout_a.addWidget(self.rename_button)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
您需要将 setCoordinateMode()
与 ObjectBoundingMode
(或 ObjectMode
用于 Qt > 5.12)或 StretchToDeviceMode
一起使用,并在 0.0-1.0 范围内设置坐标。
gradient = QLinearGradient(0, 0, 1, 0)
gradient.setCoordinateMode(gradient.ObjectMode)
对于在整个小部件上使用的渐变,它不会有太大变化,因为对象模式适用于使用 QPainter 绘制的单个“对象”(矩形、椭圆等)。
我正在尝试构建一些 UI 具有特定于背景的设计,我想知道您如何使 QLinearGradient 始终位于中间? 如果你只设置一个像 QLinearGradient(0, 0, 700, 0) 这样的数字,即使 window 将被调整大小,它也会保持在同一个位置,这是不希望的...
这里是测试代码:
from PySide2.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QApplication
from PySide2.QtGui import QLinearGradient, QPalette, QColor, QBrush
from PySide2.QtCore import Qt
class MainWindow(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent=parent)
self.setWindowFlags(Qt.Window)
self.setObjectName('Test')
self.setWindowTitle('Test')
self.mainLayout = QVBoxLayout()
self.find_line = QLineEdit()
self.replace_line = QLineEdit()
self.setLayout(self.mainLayout)
self.rename_button = QPushButton('test button')
self.h_layout_a = QHBoxLayout()
law_grad_col = self.lawrencium_gradiant_color()
self.setting_ui(set_colour=law_grad_col)
self.create()
def setting_ui(self, set_colour=None, **kwargs):
self.setPalette(set_colour)
self.resize(300, 50)
def lawrencium_gradiant_color(self, **kwargs):
p = QPalette()
gradient = QLinearGradient(0, 0, 700, 0)
gradient.setColorAt(0.0, QColor(15, 12, 41))
gradient.setColorAt(0.5, QColor(48, 43, 99))
gradient.setColorAt(1.0, QColor(36, 36, 62))
p.setBrush(QPalette.Window, QBrush(gradient))
return p
def create(self, **kwargs):
find = 'Find'
replace = 'Replace'
self.find_line.setPlaceholderText(find)
self.replace_line.setPlaceholderText(replace)
self.mainLayout.addLayout(self.h_layout_a)
self.h_layout_a.addWidget(self.find_line)
self.h_layout_a.addWidget(self.replace_line)
self.h_layout_a.addWidget(self.rename_button)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
您需要将 setCoordinateMode()
与 ObjectBoundingMode
(或 ObjectMode
用于 Qt > 5.12)或 StretchToDeviceMode
一起使用,并在 0.0-1.0 范围内设置坐标。
gradient = QLinearGradient(0, 0, 1, 0)
gradient.setCoordinateMode(gradient.ObjectMode)
对于在整个小部件上使用的渐变,它不会有太大变化,因为对象模式适用于使用 QPainter 绘制的单个“对象”(矩形、椭圆等)。