gpt4 book ai didi

python - QSS 未应用于 QVBoxLayout 中(复合小部件)中的第一个 QSizeGrip

转载 作者:行者123 更新时间:2023-12-01 08:11:04 24 4
gpt4 key购买 nike

如下所示,小部件TestWidget包含一个QFrame和一个CSS样式的QSizeGrip。几个 TestWidget 实例放置在 QVBoxLayout

from PySide import QtGui, QtCore
import sys

class TestWidget(QtGui.QWidget):
def __init__(self , parent=None):
super(TestWidget , self).__init__(parent)

layout = QtGui.QVBoxLayout()
layout.setContentsMargins( 0 , 0 , 0 , 0 )

frame = QtGui.QFrame()
frame.setFrameShape(QtGui.QFrame.StyledPanel)
frame.setMinimumHeight( 100 )

grip = QtGui.QSizeGrip(self)
grip.setStyleSheet( "QSizeGrip { image: url(dots.png); }")
grip.setCursor(QtCore.Qt.SplitVCursor)

layout.addWidget(frame)
layout.addWidget( grip , 0 , QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight )

self.setLayout(layout)

class TestApp(QtGui.QMainWindow):
def __init__(self, parent=None):
super(TestApp, self).__init__(parent)

track1 = TestWidget()
track2 = TestWidget()
track3 = TestWidget()

centralWidget = QtGui.QWidget()
layout = QtGui.QVBoxLayout(centralWidget)

layout.addWidget(track1)
layout.addWidget(track2)
layout.addWidget(track3)

self.setCentralWidget(centralWidget)
self.show()

if __name__=="__main__":
app=QtGui.QApplication(sys.argv)
myapp = TestApp();
sys.exit(app.exec_())

如下所示,仅当 TestWidget 是布局中的唯一元素时,QVBoxLayout 中第一个 TestWidget 的大小夹点才会出现.

enter image description here enter image description here enter image description here

Qt版本4.8.7

PySide 版本 1.2.2

<小时/>

PySide2版本的程序(如下)也有同样的问题

from PySide2 import QtCore
from PySide2.QtWidgets import QApplication, QWidget , QMainWindow , QGraphicsView , QVBoxLayout , QFrame , QSizeGrip , QWidget

import sys

class TestWidget(QWidget):
def __init__(self , parent=None):
super(TestWidget , self).__init__(parent)

layout = QVBoxLayout()
layout.setContentsMargins( 0 , 0 , 0 , 0 )

frame = QFrame()
frame.setFrameShape(QFrame.StyledPanel)
frame.setMinimumHeight( 100 )

grip = QSizeGrip(self)
grip.setStyleSheet( "QSizeGrip { image: url(dots.png); }")
grip.setCursor(QtCore.Qt.SplitVCursor)

layout.addWidget(frame)
layout.addWidget( grip , 0 , QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight )

self.setLayout(layout)

class TestApp(QMainWindow):
def __init__(self, parent=None):
super(TestApp, self).__init__(parent)

track1 = TestWidget()
track2 = TestWidget()
track3 = TestWidget()

centralWidget = QWidget()
layout = QVBoxLayout(centralWidget)

layout.addWidget(track1)
layout.addWidget(track2)
layout.addWidget(track3)

self.setCentralWidget(centralWidget)
self.show()

if __name__=="__main__":
app = QApplication(sys.argv)
myapp = TestApp();
sys.exit(app.exec_())

PySide2版本5.12.1

最佳答案

如果 source code 则观察到的是预定行为,但未记录在案。修改后将被观察:

Qt::Corner QSizeGripPrivate::corner() const
{
Q_Q(const QSizeGrip);
QWidget *tlw = qt_sizegrip_topLevelWidget(const_cast<QSizeGrip *>(q));
const QPoint sizeGripPos = q->mapTo(tlw, QPoint(0, 0));
bool isAtBottom = sizeGripPos.y() >= tlw->height() / 2;
bool isAtLeft = sizeGripPos.x() <= tlw->width() / 2;
if (isAtLeft)
return isAtBottom ? Qt::BottomLeftCorner : Qt::TopLeftCorner;
else
return isAtBottom ? Qt::BottomRightCorner : Qt::TopRightCorner;
}

如果 sizeGrip 位于窗口的上部,则观察到它被放置在上部,这就是它观察到的行为的原因。

解决方法是覆盖QSizeGrip的paintEvent方法:

PySide2:

import sys
from PySide2 import QtCore, QtGui, QtWidgets

class SizeGrip(QtWidgets.QSizeGrip):
def paintEvent(self, event):
painter = QtGui.QPainter(self)
opt = QtWidgets.QStyleOptionSizeGrip()
opt.initFrom(self)
opt.corner = QtCore.Qt.BottomRightCorner
self.style().drawControl(QtWidgets.QStyle.CE_SizeGrip, opt, painter, self)

class TestWidget(QtWidgets.QWidget):
def __init__(self , parent=None):
super(TestWidget , self).__init__(parent)
layout = QtWidgets.QVBoxLayout(self)
layout.setContentsMargins( 0 , 0 , 0 , 0 )
frame = QtWidgets.QFrame()
frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
frame.setMinimumHeight( 100 )
grip = SizeGrip(self)
grip.setStyleSheet('''QSizeGrip {
image: url(dots.png);
}''')
layout.addWidget(frame)
layout.addWidget(grip , 0 , QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight )

class TestApp(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(TestApp, self).__init__(parent)
centralWidget = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(centralWidget)
for _ in range(3):
layout.addWidget(TestWidget())
self.setCentralWidget(centralWidget)
self.show()

if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
myapp = TestApp();
sys.exit(app.exec_())

PySide:

import sys
from PySide import QtCore, QtGui

class SizeGrip(QtGui.QSizeGrip):
def paintEvent(self, event):
painter = QtGui.QPainter(self)
opt = QtGui.QStyleOptionSizeGrip()
opt.initFrom(self)
opt.corner = QtCore.Qt.BottomRightCorner
self.style().drawControl(QtGui.QStyle.CE_SizeGrip, opt, painter, self)

class TestWidget(QtGui.QWidget):
def __init__(self , parent=None):
super(TestWidget , self).__init__(parent)
layout = QtGui.QVBoxLayout(self)
layout.setContentsMargins( 0 , 0 , 0 , 0 )
frame = QtGui.QFrame()
frame.setFrameShape(QtGui.QFrame.StyledPanel)
frame.setMinimumHeight( 100 )
grip = SizeGrip(self)
grip.setStyleSheet('''QSizeGrip {
image: url(dots.png);
}''')
grip.setCursor(QtCore.Qt.SplitVCursor)
layout.addWidget(frame)
layout.addWidget(grip , 0 , QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight )

class TestApp(QtGui.QMainWindow):
def __init__(self, parent=None):
super(TestApp, self).__init__(parent)
centralWidget = QtGui.QWidget()
layout = QtGui.QVBoxLayout(centralWidget)
for _ in range(3):
layout.addWidget(TestWidget())
self.setCentralWidget(centralWidget)
self.show()

if __name__=="__main__":
app = QtGui.QApplication(sys.argv)
myapp = TestApp();
sys.exit(app.exec_())

enter image description here

关于python - QSS 未应用于 QVBoxLayout 中(复合小部件)中的第一个 QSizeGrip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55251122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com