Pyqt QSplitter неправильно визуализируется - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь включить QSplitter.Код прекрасно работает с точки зрения функциональности, но сам QSplitter не отображается правильно под стилем PyQt по умолчанию ... возможно, потому что он сам встроен в вертикальный разделитель.Это сбивает с толку пользователя.

Если вы раскомментируете строку (и, таким образом, меняете стиль PyQt по умолчанию), QSplitter визуализируется правильно только при наведении курсора ... однако я также не хочу этого другогоstyle.

Может ли кто-нибудь дать какие-либо рекомендации по этому вопросу?

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Example(QWidget):

   def __init__(self):
       super(Example, self).__init__()  
       self.initUI()

   def initUI(self):

       hbox = QHBoxLayout(self)

       L_layout = QGridLayout()
       R_layout = QGridLayout()

       L_widgets = QWidget()
       L_widgets.setLayout(L_layout)

       R_widgets = QWidget()
       R_widgets.setLayout(R_layout)

       topleft = QFrame()
       topleft.setFrameShape(QFrame.StyledPanel)

       btn1 = QPushButton('btn1')

       bottom = QFrame()
       bottom.setFrameShape(QFrame.StyledPanel)
       textedit = QTextEdit()

       L_layout.addWidget(topleft, 0, 0, 1, 1)
       L_layout.addWidget(btn1, 1, 0, 1, 1)
       R_layout.addWidget(textedit)

       splitter1 = QSplitter(Qt.Horizontal,frameShape=QFrame.StyledPanel,frameShadow=QFrame.Plain)
       splitter1.addWidget(L_widgets)
       splitter1.addWidget(R_widgets)
       splitter1.setStretchFactor(1,1)

       splitter2 = QSplitter(Qt.Vertical)
       splitter2.addWidget(splitter1)
       splitter2.addWidget(bottom)

       hbox.addWidget(splitter2)

       self.setLayout(hbox)
       #QApplication.setStyle(QStyleFactory.create('Cleanlooks'))

       self.setGeometry(300, 300, 300, 200)
       self.setWindowTitle('QSplitter demo')
       self.show()

def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Image1

Image2


РЕДАКТИРОВАТЬ: Это, очевидно, известная ошибка macOS.При просмотре в Linux полоса splitter1 выглядит так же, как splitter2.Я оставлю эту тему открытой на случай, если кто-нибудь еще знает о подходящем обходном пути для Mac.

1 Ответ

0 голосов
/ 28 декабря 2018

Поскольку QPushButton имеет минимальный размер по умолчанию, когда вы хотите переместить разделитель влево,
кнопка достигла своего минимального размера.Таким образом, вы не можете больше двигаться влево, в противном случае левый рухнет.

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

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Example(QWidget):

   def __init__(self):
       super(Example, self).__init__()  
       self.initUI()

   def initUI(self):

       hbox = QHBoxLayout(self)

       L_layout = QGridLayout()
       R_layout = QGridLayout()

       L_widgets = QWidget()
       L_widgets.setLayout(L_layout)

       R_widgets = QWidget()
       R_widgets.setLayout(R_layout)

       topleft = QFrame()
       topleft.setFrameShape(QFrame.StyledPanel)

       btn1 = QPushButton('btn1')
       btn1.setMinimumWidth(1)  # For example : set the minimum width to 1, then you can move left until the btn1 width is 1

       bottom = QFrame()
       bottom.setFrameShape(QFrame.StyledPanel)
       textedit = QTextEdit()

       L_layout.addWidget(topleft, 0, 0, 1, 1)
       L_layout.addWidget(btn1, 1, 0, 1, 1)
       R_layout.addWidget(textedit)

       splitter1 = QSplitter(Qt.Horizontal,frameShape=QFrame.StyledPanel,frameShadow=QFrame.Plain)
       splitter1.addWidget(L_widgets)
       splitter1.addWidget(R_widgets)
       splitter1.setStretchFactor(1,1)

       splitter2 = QSplitter(Qt.Vertical)
       splitter2.addWidget(splitter1)
       splitter2.addWidget(bottom)

       hbox.addWidget(splitter2)

       self.setLayout(hbox)
       #QApplication.setStyle(QStyleFactory.create('Cleanlooks'))

       self.setGeometry(300, 300, 300, 200)
       self.setWindowTitle('QSplitter demo')
       self.show()

def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
...