首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSS未应用于QVBoxLayout (复合小部件)中的第一个QSS

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

Stack Overflow用户
提问于 2019-03-19 22:53:24
回答 1查看 329关注 0票数 1

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

代码语言:javascript
复制
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的大小抓地力才会出现。

Qt版本4.8.7

PySide版本1.2.2

程序的PySide2版本(下面)也有相同的问题

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-21 01:01:31

所观察到的是预先确定的行为,但没有记录在案,如果修改了源代码,就会观察到:

代码语言:javascript
复制
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的QSizeGrip方法:

PySide2:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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_())   

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55251122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档