Как избавиться от зазоров между виджетами?

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

введите сюда описание изображения

Мне необходимо убрать эти зазоры, чтобы элементы располагались таким образом:

введите сюда описание изображения

Я пытался поправить это, добавив элементам QListWidget рамку, цвет которой идентичен цвету этих элементов. Мне кажется, что это плохой способ, т.к. нарушились бы текущие размеры. В любом случае, добавил в таблицу стиля элементов QListWidget следующие строки:

...
border-color: #7189DB;
border-style: solid;
border-width: 1px;
...

Как это полагается, я только все сломал.

Пожалуйста, подскажите, как мне добиться такого результата?

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt

class LeftTabWidget(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super(LeftTabWidget, self).__init__(*args, **kwargs)
        self.setMinimumSize(500, 300)

        btn = QtWidgets.QPushButton('Button')
        layout1 = QtWidgets.QHBoxLayout(self)
        layout1.addWidget(btn)

        self.listWidget = QtWidgets.QListWidget()
        self.listWidget.setContentsMargins(0, 0, 0, 0) 
        self.listWidget.setViewMode(QtWidgets.QListView.IconMode)
        self.listWidget.setIconSize(QtCore.QSize(60, 60))
        self.listWidget.setMovement(QtWidgets.QListView.Static)
        self.listWidget.setMaximumWidth(61)
        self.listWidget.setMinimumWidth(61)
        self.listWidget.setSpacing(0)  

        self.stackedWidget = QtWidgets.QStackedWidget()
        for i in range(2):
            label = QtWidgets.QLabel('Страница %d' % (i + 1), self)
            label.setAlignment(QtCore.Qt.AlignCenter)
#            label.setStyleSheet('background: #7189DB; margin: 0px;')
            self.stackedWidget.addWidget(label)

        self.createIcons()
        self.listWidget.setCurrentRow(0)

        layout2 = QtWidgets.QHBoxLayout(spacing=0) 
        layout2.setContentsMargins(0, 0, 0, 0)
        layout2.addWidget(self.listWidget)              
        layout2.addWidget(self.stackedWidget, 1)
        layout1.addLayout(layout2)

    def createIcons(self):
        configButton = QtWidgets.QListWidgetItem(self.listWidget)
        configButton.setIcon(QtGui.QIcon('play.png'))
        configButton.setTextAlignment(Qt.AlignHCenter)
        configButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        updateButton = QtWidgets.QListWidgetItem(self.listWidget)
        updateButton.setIcon(QtGui.QIcon('play.png'))
        updateButton.setTextAlignment(Qt.AlignHCenter)
        updateButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        self.listWidget.currentItemChanged.connect(self.changePage)

    def changePage(self, current, previous):
        if not current:
            current = previous
        self.stackedWidget.setCurrentIndex(self.listWidget.row(current))



Stylesheet = '''
QListWidget {
    border: none;     
}

QListWidget::item {
    width: 60px;
    height: 60px;
    color: #3b4155;
}

QListWidget::item:selected {
    background-color: #7189DB;
}

QLabel {
    background: #7189DB;
    margin: 0px;
    color: white;
    font: 21pt;
}
'''


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(Stylesheet)
    w = LeftTabWidget()
    w.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так:

  1. измените self.listWidget.setMaximumWidth(60)
  2. измените self.listWidget.setMinimumWidth(60)
  3. добавьте

    QListWidget::item:!selected { /* <<<-----< */ background-color: #7189DB; }


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt

class LeftTabWidget(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super(LeftTabWidget, self).__init__(*args, **kwargs)
        self.setMinimumSize(500, 300)

        btn = QtWidgets.QPushButton('Button')
        layout1 = QtWidgets.QHBoxLayout(self)
        layout1.addWidget(btn)

        self.listWidget = QtWidgets.QListWidget()
        self.listWidget.setContentsMargins(0, 0, 0, 0) 
        self.listWidget.setViewMode(QtWidgets.QListView.IconMode)
        self.listWidget.setIconSize(QtCore.QSize(60, 60))               
        self.listWidget.setMovement(QtWidgets.QListView.Static)
        self.listWidget.setMaximumWidth(60)                               # - 61  + 60
        self.listWidget.setMinimumWidth(60)                               # - 61  + 60
        self.listWidget.setSpacing(0)  

        self.stackedWidget = QtWidgets.QStackedWidget()
        for i in range(2):
            label = QtWidgets.QLabel('Страница %d' % (i + 1), self)
            label.setAlignment(QtCore.Qt.AlignCenter)
#            label.setStyleSheet('background: #7189DB; margin: 0px;')
            self.stackedWidget.addWidget(label)

        self.createIcons()
        self.listWidget.setCurrentRow(0)

        layout2 = QtWidgets.QHBoxLayout(spacing=0) 
        layout2.setContentsMargins(0, 0, 0, 0)
        layout2.addWidget(self.listWidget)              
        layout2.addWidget(self.stackedWidget, 1)
        layout1.addLayout(layout2)

    def createIcons(self):
        configButton = QtWidgets.QListWidgetItem(self.listWidget)
        configButton.setIcon(QtGui.QIcon('play.png'))
        configButton.setTextAlignment(Qt.AlignHCenter)
        configButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        updateButton = QtWidgets.QListWidgetItem(self.listWidget)
        updateButton.setIcon(QtGui.QIcon('play.png'))
        updateButton.setTextAlignment(Qt.AlignHCenter)
        updateButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)

        self.listWidget.currentItemChanged.connect(self.changePage)

    def changePage(self, current, previous):
        if not current:
            current = previous
        self.stackedWidget.setCurrentIndex(self.listWidget.row(current))


Stylesheet = '''
QListWidget {
    border: none;   
}

QListWidget::item {
    width: 60px;
    height: 60px;
    color: #3b4155;
}

QListWidget::item:selected {
    background-color: #7189DB;
}
QListWidget::item:!selected {                     /* <<<-----<  */
    background-color: #7189DB;
}

QLabel {
    background: #7189DB;
    margin: 0px;
    color: white;
    font: 21pt;
}
'''


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(Stylesheet)
    w = LeftTabWidget()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка