Автоперенос элемента QComboBox
Столкнулся с проблемой автопереноса элементов выпадающего списка QComboBox, то есть, если элемент не помещается в ширину списка, он будет выводиться вот так:
очень дли...элемент
Я хочу реализовать, чтобы значение элемента выводилось полностью и строка автоматически переносилась в случае нехватки места, а результат получался таким:
очень длинный
элемент
Я делал похожее с QTableWidget, и там работал метод resizeRowsToContents(), но в QComboBox это не работает.
Возможно ли это реализовать в QComboBox?
Пример:
combo1 = QComboBox(self)
combo1.setGeometry(100, 270, 350, 50)
combo1.addItem("ооооченьььь длинннннннннннннннный элемееееееент")
Мне надо избавиться от точек посередине, чтобы элемент выводился полностью, а те символы, которые не помещаются, переносились на следующую строку.
Python 3.6.2
PyQt5 5.15.4
Ответы (2 шт):
Я предложу вам попробовать другой возможный вариант (не совсем автоперенос),
отличный от того что вам уже предложили.
Есть две внешне похожие строки.
Посмотрите как они выглядят после применения:
sizeAdjustPolicy:SizeAdjustPolicy определяет, как подсказка размера QComboBox должна регулироваться
при добавлении нового содержимого или изменении содержимого.
sizePolicy:QSizePolicy
содержит поведение layout по умолчанию для виджета.
self.combo.SizeAdjustPolicy(QComboBox.AdjustToContents)
self.combo.setSizePolicy(
QSizePolicy.Maximum,
QSizePolicy.Minimum
)
А также посмотрите как это все выглядит в различных стилях, которые доступны на вашем ПК.
Класс QStyleFactory создает объекты QStyle.
Класс QStyle - это абстрактный базовый класс, который инкапсулирует
внешний вид графического интерфейса пользователя.
QStyleFactory создает объект QStyle, используя функцию create()
и key, определяющий стиль.
Стили либо встроены, либо динамически загружаются из подключаемого модуля стиля
(см. QStylePlugin).
Действительные keys можно получить с помощью функции keys().
Обычно они включают "windows" и "fusion".
В зависимости от платформы могут быть доступны "windowsvista" и "macintosh".
Обратите внимание, что ключи нечувствительны к регистру.
import sys
from PyQt5.Qt import *
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.combo = QComboBox()
self.combo.setObjectName('comboBox')
self.combo.setMinimumContentsLength(22) # !!!
self.combo.addItem(
"ооооченьььь длинннннн \n1234567890 нннннннннный \nэлемееееееент")
self.combo.addItem( # ^^<---- ^^<---- # !!!
"ооооченьььь длинннннн 1234567890 нннннннннный элемееееееент")
# Добавить стили из QStyleFactory
self.combo.addItems(QStyleFactory.keys())
# Выберите текущий стиль интерфейса
index = self.combo.findText(
'Fusion',
Qt.MatchFixedString
)
self.combo.SizeAdjustPolicy(QComboBox.AdjustToContents) # !!!
self.combo.setSizePolicy( # !!!
QSizePolicy.Maximum, # !!!
QSizePolicy.Minimum # !!!
)
self.btn = QPushButton("Это кнопка.")
self.btn.setFixedSize(78, 78)
layout = QHBoxLayout(self)
layout.addWidget(self.combo)
layout.addWidget(self.btn)
self.combo.currentTextChanged.connect(self.onActivated)
self.combo.setCurrentIndex(index)
def onActivated(self, value):
QApplication.setStyle(value) # !!!
self.btn.setFocus()
qssStyle = '''
QComboBox {
color: #91091E;
background: #BDC7C9;
font-size: 12pt;
}
QComboBox:hover {
background-color: rgb(236, 236, 136);
}
QComboBox#comboBox::drop-down {
/* image: none; */
image: url(monkey.png);
}
'''
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setStyleSheet(qssStyle)
w = MainWindow()
w.resize(100, 100)
w.show()
sys.exit(app.exec_())
monkey.png
Чтобы получить вот такое:
Вам понадобится QListView (с небольшими, но важными настройками), QStringListModel (это для примера, можно и любую другую модель) и сам QComboBox.
Пример:
import sys
from PyQt5.QtWidget import QComboBox, QListView, QApplication
from PyQt5.QtCore import QStringListModel
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
combo = QComboBox()
combo.setMaximumWidth(150)
# Данные заполняются через модель QStringListModel
combo.setModel(QStringListModel([
'1. Lo',
'2. Lorem',
'3. Lorem ipsum dolor sit amet, consectetur',
'4. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut',
'5. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco labor'
]))
# Отображатель выпадающего списка QListView
listView = QListView()
# Включаем перенос строк
listView.setWordWrap(True)
# Устанавливаем отображатель списка (popup)
combo.setView(listView)
combo.show()
sys.exit(app.exec_())








