Как убрать лишние края вокруг изображения в QListWidget?
Кнопка btn не выполняет никаких функций. Я добавил ее, т.к. в окне будут и другие элементы, т.е. мне нужно видеть, как QListWidget + QStackedWidget будут расположены, если окажутся не одни в приложении.
Проблема этого кода в том, что изображение, попадающее в QListWidget, почему-то уменьшается и располагается у левой границы виджета:
Мне бы хотелось, чтобы изображение принимало размер примерно 40px*40px, а размер QListWidget определялся размером изображения(т.е. чтобы не было рамки):
Пожалуйста, подскажите, как это можно сделать?
from PyQt5 import QtCore, QtGui, QtWidgets
class LeftTabWidget(QtWidgets.QWidget):
def __init__(self, *args, **kwargs):
super(LeftTabWidget, self).__init__(*args, **kwargs)
self.resize(400, 300)
layout1 = QtWidgets.QHBoxLayout(self)
btn = QtWidgets.QPushButton('Button')
layout1.addWidget(btn)
layout2 = QtWidgets.QHBoxLayout(spacing=0)
layout2.setContentsMargins(0, 0, 0, 0)
layout1.addLayout(layout2)
self.listWidget = QtWidgets.QListWidget(self)
layout2.addWidget(self.listWidget)
self.stackedWidget = QtWidgets.QStackedWidget(self)
layout2.addWidget(self.stackedWidget)
self.initUi()
def initUi(self):
self.listWidget.currentRowChanged.connect(self.stackedWidget.setCurrentIndex)
self.listWidget.setFrameShape(QtWidgets.QListWidget.NoFrame)
self.listWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.listWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
for i in range(2):
item = QtWidgets.QListWidgetItem(QtGui.QIcon('play.png'), '', self.listWidget)
item.setSizeHint(QtCore.QSize(60, 60))
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)
Stylesheet = '''
QListWidget, QListView, QTreeWidget, QTreeView {
outline: 0px;
}
QListWidget::item:selected {
background: #7189DB;
}
HistoryPanel::item:hover {background: rgb(52, 52, 52);}
QStackedWidget {background: rgb(30, 30, 30);}
'''
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(Stylesheet)
w = LeftTabWidget()
w.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я немного изменил код и оставил цветовую палитру, чтобы вы увидели что есть что, измените как вам надо.
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) # !!! stretch=1
layout1.addLayout(layout2)
def createIcons(self):
configButton = QtWidgets.QListWidgetItem(self.listWidget)
configButton.setIcon(QtGui.QIcon('play.png'))
# configButton.setText("")
configButton.setTextAlignment(Qt.AlignHCenter)
configButton.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
updateButton = QtWidgets.QListWidgetItem(self.listWidget)
updateButton.setIcon(QtGui.QIcon('play.png'))
# updateButton.setText("")
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;
background-color: #ff0;
}
QListWidget::item {
width: 60px;
height: 60px;
color: #3b4155;
}
QListWidget::item:hover {
background-color: #f0f;
}
QListWidget::item:selected {
background-color: #0ff;
}
QLabel {
background: #FF3333;
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_())


