PYQT QSplitter проблема - PullRequest
       44

PYQT QSplitter проблема

3 голосов
/ 24 августа 2011

Я использую QSplitter и обнаружил, что минимальная ширина виджета в разделителе составляет 32 пикселя (и 23 пикселя в высоту).Кто-нибудь знает, как изменить это значение по умолчанию?Другими словами, вы не можете перетащить сплиттер, чтобы один из виджетов (предположим, что в сплиттере есть 2 виджета) в сплиттере имел ширину менее 32 пикселей.

Код:

class Example(QtGui.QWidget):

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

    def initUI(self):

        self.resize(400,400)

        m = QtGui.QSplitter(self)
        m.resize(200, 100)

        x = QtGui.QPushButton(m)
        x.setGeometry(0, 0, 100, 100)

        y = QtGui.QPushButton(m)
        y.setGeometry(0, 100, 100, 100)


        m.setSizes([20, 180])
        # this will show you that the width of x is 32 (it should be 20!)
        print x.width()

1 Ответ

0 голосов
/ 18 октября 2017

Примечание: я использую Python 3.6.2 и PyQt5, хотя логика в этом примере остается той же и понятной, даже если вы используете другие версии Python и PyQt.

Посмотрите, что здесь сказано :

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

Один из вариантов решения вашей проблемы - вызвать * 1015.* с небольшим значением, например:

x.setMinimumWidth(1)

Однако, если вы попробуете это сами, вы увидите, что

  1. это грязный хак, так как он фактически уходитвиджет здесь просто делает его очень узким и
  2. , хотя теперь вы можете перетаскивать разделитель, начальная ширина виджета по-прежнему «32» вместо «20».

x.setMinimumWidth(0)

также не работает должным образом: его минимальная ширина фактически равна нулю по умолчанию (так как у этого виджета нет содержимого, я полагаю), ноэто не поможет вам сделать элемент разделителя шириной менее 32 пикселей, если вы не свернете его.

Кстати, установите

m.setCollapsible(0, False)
m.setCollapsible(1, False)

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

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

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#Python 3.6.2 and PyQt5 are used in this example


from PyQt5.QtWidgets import (
  QPushButton,
  QSplitter,
  QWidget,
  QApplication,
)

import sys


class ButtonWrapper(QPushButton):

    def sizeHint(self):

        return self.minimumSize()


class Example(QWidget):

    def __init__(self):

        super().__init__()
        self.initUI()

    def initUI(self):

        self.resize(400, 400)

        m = QSplitter(self)
        m.resize(200, 100)

        x = ButtonWrapper(self)
        x.setGeometry(0, 0, 100, 100)

        y = QPushButton(self)
        y.setGeometry(0, 100, 100, 100)

        m.addWidget(x)
        m.addWidget(y)

        m.setSizes([20, 180])

        #Now it really shows "20" as expected
        print(x.width())

        #minimumWidth() is zero by default for empty QPushButton
        print(x.minimumWidth())

        #Result of our overloaded sizeHint() method
        print(x.sizeHint().width())
        print(x.minimumSizeHint().width())

        self.setWindowTitle('Example')
        self.show()


if __name__ == '__main__':

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

Я не уверен, что это правильный способ делать вещи, но я потратил много времени, пытаясь решить моюсвоя собственная проблема, связанная с этим, и до сих пор не видела ничего удовлетворительного.Я буду очень признателен, если кто-то знает, что лучше реально работает и работает обходной путь.

...