Изменение ширины виджета QComboBox

Рейтинг: 2Ответов: 1Опубликовано: 20.02.2023

Я написал графический интерфейс на PyQt5 с таблицей и полями для ввода данных для фильтрации в таблице.
Поле над столбцом "Код события" реализовано с помощь QComboBox.

self.filter_event_code = QComboBox()
        ev_list = [
            '61 - большое сопротивление СЛИ, АУ могут работать нестабильно, заряд ионисторов запрещен',
            '79 - норма напряжения БП', '138 - нагрев НЭ', '148 - вскрытие оросителя',
            '201 - задвижка в промежуточном положении',
            '205 - обрыв ЛО']
        for item in ev_list:
            self.filter_event_code.addItem(item)

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

import sys
from PyQt5.QtCore import QDateTime
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from styles import AlignDelegate

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # конфигурация главного окна и центрального виджета
        self.central_widget = QWidget(self)
        self.setGeometry(50, 50, 1500, 800)
        self.setCentralWidget(self.central_widget)
        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)
        
        # конфигурация верхней панели инструментов
        self.layout_toolbar = QHBoxLayout()
        # конфигурация кнопок
        self.layout_toolbar_buttons = QHBoxLayout()
        self.layout_toolbar_buttons.addStretch(1)
        self.btn_monitoring = QPushButton("Мониторинг")
        self.btn_start_reading = QPushButton("Считать")
        self.btn_download_from_file = QPushButton("Загрузить из файла")
        self.btn_save_to_file = QPushButton("Экспорт")
        self.layout_toolbar_buttons.addWidget(self.btn_monitoring)
        self.layout_toolbar_buttons.addWidget(self.btn_start_reading)
        self.layout_toolbar_buttons.addWidget(self.btn_download_from_file)
        self.layout_toolbar_buttons.addWidget(self.btn_save_to_file)
        
        # конфигурация фильтров
        self.layout_toolbar_filters = QHBoxLayout()
        self.filter_number = QLineEdit()
        self.filter_datetime_from = QDateTimeEdit(QDateTime.currentDateTime())
        self.filter_datetime_from.setDisplayFormat('yyyy.MM.dd HH:mm:ss')
        self.filter_datetime_from.setCalendarPopup(True)
        self.filter_datetime_to = QDateTimeEdit(QDateTime.currentDateTime())
        self.filter_datetime_to.setDisplayFormat('yyyy.MM.dd HH:mm:ss')
        self.filter_datetime_to.setCalendarPopup(True)
        self.filter_bku = QLineEdit()
        self.filter_kl = QLineEdit()
        self.filter_au = QLineEdit()
        self.filter_channel = QLineEdit()
        # _______________________________________________________________________________
        # у этого комбобокса надо изменить ширину при открытии
        self.filter_event_code = QComboBox()
        ev_list = [
            '61 - большое сопротивление СЛИ, АУ могут работать нестабильно, заряд ионисторов запрещен',
            '79 - норма напряжения БП', '138 - нагрев НЭ', '148 - вскрытие оросителя',
            '201 - задвижка в промежуточном положении',
            '205 - обрыв ЛО']
        for item in ev_list:
            self.filter_event_code.addItem(item)
        self.filter_add_param = QLineEdit()

        filters = [
            self.filter_number, self.filter_bku, self.filter_kl,self.filter_au,
            self.filter_channel, self.filter_event_code, self.filter_add_param,
        ]
        for filter in filters:
            filter.setMaximumWidth(60)
        self.filter_datetime_from.setMinimumWidth(130)
        self.filter_datetime_to.setMinimumWidth(130)
        self.filter_event_code.setMinimumWidth(65)

        # чекбоксы
        self.checkbox_number = QCheckBox()
        self.checkbox_datetime = QCheckBox()
        self.checkbox_bku = QCheckBox()
        self.checkbox_kl = QCheckBox()
        self.checkbox_au = QCheckBox()
        self.checkbox_channel = QCheckBox()
        self.checkbox_event_code = QCheckBox()
        self.checkbox_add_param = QCheckBox()

        # слои
        self.layout_toolbar_filters.addSpacing(50)
        self.layout_toolbar_filters.addWidget(self.filter_number)
        self.layout_toolbar_filters.addWidget(self.checkbox_number)
        self.layout_toolbar_filters.addSpacing(10)
        self.layout_toolbar_filters.addWidget(self.filter_datetime_from)
        self.layout_toolbar_filters.addWidget(QLabel('-'))
        self.layout_toolbar_filters.addWidget(self.filter_datetime_to)
        self.layout_toolbar_filters.addWidget(self.checkbox_datetime)
        self.layout_toolbar_filters.addSpacing(10)
        self.layout_toolbar_filters.addWidget(self.filter_bku)
        self.layout_toolbar_filters.addWidget(self.checkbox_bku)
        self.layout_toolbar_filters.addSpacing(15)
        self.layout_toolbar_filters.addWidget(self.filter_kl)
        self.layout_toolbar_filters.addWidget(self.checkbox_kl)
        self.layout_toolbar_filters.addSpacing(15)
        self.layout_toolbar_filters.addWidget(self.filter_au)
        self.layout_toolbar_filters.addWidget(self.checkbox_au)
        self.layout_toolbar_filters.addSpacing(15)
        self.layout_toolbar_filters.addWidget(self.filter_channel)
        self.layout_toolbar_filters.addWidget(self.checkbox_channel)
        self.layout_toolbar_filters.addSpacing(15)  
        self.layout_toolbar_filters.addWidget(self.filter_event_code)
        self.layout_toolbar_filters.addWidget(self.checkbox_event_code)
        self.layout_toolbar_filters.addSpacing(15)
        self.layout_toolbar_filters.addWidget(self.filter_add_param)
        self.layout_toolbar_filters.addWidget(self.checkbox_add_param)

        self.layout_toolbar.addLayout(self.layout_toolbar_filters)
        self.layout_toolbar.addLayout(self.layout_toolbar_buttons)
        self.layout_main_window.addLayout(self.layout_toolbar)

        # конфигурация таблицы
        self.layout_table = QHBoxLayout()
        self.table = QTableWidget()
        self.table.setColumnCount(9)
        self.table.setRowCount(13500)
        self.table.setHorizontalHeaderLabels(['№', 'Дата и время', 'БКУ', 'КЛ', 'АУ', 'Канал', 'Код события', 'Доп. параметр', 'Описание'])
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.horizontalHeader().setVisible(True)
        for col in range(8):
            self.table.setColumnWidth(col, 100)
        self.table.setColumnWidth(1, 300)
        self.table_alignment = AlignDelegate(self.table) # выравниевание данных в ячейках по центру
        self.table.setItemDelegate(self.table_alignment) # выравниевание данных в ячейках по центру
        self.layout_table.addWidget(self.table)
        self.layout_main_window.addLayout(self.layout_table)


app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())

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

Ответы

▲ 1Принят

Я немного изменил расстановку виджетов, т.к. ваше приложение не помещается на моем экране. Восстановите как вам надо.

Я отметил для вас строки, которые надо добавить.

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

# ??? from styles import AlignDelegate                               # ???


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # конфигурация главного окна и центрального виджета
        self.central_widget = QWidget(self)
        
#        self.setGeometry(50, 50, 1500, 800)
        self.resize(1255, 500)                                       # +
        
        self.setCentralWidget(self.central_widget)
        self.layout_main_window = QVBoxLayout()
        self.central_widget.setLayout(self.layout_main_window)
        
        # конфигурация верхней панели инструментов
        self.layout_toolbar = QHBoxLayout()
        # конфигурация кнопок
        self.layout_toolbar_buttons = QHBoxLayout()
        self.layout_toolbar_buttons.addStretch(1)
        self.btn_monitoring = QPushButton("Мониторинг")
        self.btn_start_reading = QPushButton("Считать")
        self.btn_download_from_file = QPushButton("Загрузить из файла")
        self.btn_save_to_file = QPushButton("Экспорт")
        self.layout_toolbar_buttons.addWidget(self.btn_monitoring)
        self.layout_toolbar_buttons.addWidget(self.btn_start_reading)
        self.layout_toolbar_buttons.addWidget(self.btn_download_from_file)
        self.layout_toolbar_buttons.addWidget(self.btn_save_to_file)
        
        # конфигурация фильтров
#        self.layout_toolbar_filters = QHBoxLayout()
        self.filter_number = QLineEdit()
        self.filter_datetime_from = QDateTimeEdit(QDateTime.currentDateTime())
        self.filter_datetime_from.setDisplayFormat('yyyy.MM.dd HH:mm:ss')
        self.filter_datetime_from.setCalendarPopup(True)
        self.filter_datetime_to = QDateTimeEdit(QDateTime.currentDateTime())
        self.filter_datetime_to.setDisplayFormat('yyyy.MM.dd HH:mm:ss')
        self.filter_datetime_to.setCalendarPopup(True)
        self.filter_bku = QLineEdit()
        self.filter_kl = QLineEdit()
        self.filter_au = QLineEdit()
        self.filter_channel = QLineEdit()
# ____________________________________________________
# у этого комбобокса надо изменить ширину при открытии
        self.filter_event_code = QComboBox()
        ev_list = [
            '61 - большое сопротивление СЛИ, АУ могут работать '
            'нестабильно, заряд ионисторов запрещен',
            '79 - норма напряжения БП', 
            '138 - нагрев НЭ', 
            '148 - вскрытие оросителя',
            '201 - задвижка в промежуточном положении',
            '205 - обрыв ЛО']
#        for item in ev_list:
#            self.filter_event_code.addItem(item)
        self.filter_event_code.addItems(ev_list)                         # +++

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        self.filter_event_code.SizeAdjustPolicy(QComboBox.AdjustToContents)        
        self.filter_event_code.setSizePolicy(
            QtWidgets.QSizePolicy.Maximum,        
            QtWidgets.QSizePolicy.Minimum        
        )
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            
        self.filter_add_param = QLineEdit()

        filters = [
            self.filter_number, self.filter_bku, self.filter_kl,
            self.filter_au, self.filter_channel, 
            self.filter_event_code, self.filter_add_param,
        ]

        for filter in filters:
            filter.setMaximumWidth(60)
        self.filter_datetime_from.setMinimumWidth(130)
        self.filter_datetime_to.setMinimumWidth(130)
        self.filter_event_code.setMinimumWidth(65)

        # чекбоксы
        self.checkbox_number = QCheckBox()
        self.checkbox_datetime = QCheckBox()
        self.checkbox_bku = QCheckBox()
        self.checkbox_kl = QCheckBox()
        self.checkbox_au = QCheckBox()
        self.checkbox_channel = QCheckBox()
        self.checkbox_event_code = QCheckBox()
        self.checkbox_add_param = QCheckBox()

        # слои
        self.layout_toolbar_filters = QHBoxLayout()                      # +
        self.layout_toolbar_filters.addSpacing(50)
        self.layout_toolbar_filters.addWidget(self.filter_number)
        self.layout_toolbar_filters.addWidget(self.checkbox_number)
        self.layout_toolbar_filters.addSpacing(10)
        self.layout_toolbar_filters.addWidget(self.filter_datetime_from)
        self.layout_toolbar_filters.addWidget(QLabel('-'))
        self.layout_toolbar_filters.addWidget(self.filter_datetime_to)
        self.layout_toolbar_filters.addWidget(self.checkbox_datetime)
        self.layout_toolbar_filters.addSpacing(10)
        self.layout_toolbar_filters.addWidget(self.filter_bku)
        self.layout_toolbar_filters.addWidget(self.checkbox_bku)
        self.layout_toolbar_filters.addSpacing(15)
        self.layout_toolbar_filters.addWidget(self.filter_kl)
        self.layout_toolbar_filters.addWidget(self.checkbox_kl)
        self.layout_toolbar_filters.addSpacing(15)
        self.layout_toolbar_filters.addWidget(self.filter_au)
        self.layout_toolbar_filters.addWidget(self.checkbox_au)
        self.layout_toolbar_filters.addSpacing(15)
        self.layout_toolbar_filters.addWidget(self.filter_channel)
        self.layout_toolbar_filters.addWidget(self.checkbox_channel)
        self.layout_toolbar_filters.addSpacing(15)  
        self.layout_toolbar_filters.addWidget(self.filter_event_code)
        self.layout_toolbar_filters.addWidget(self.checkbox_event_code)
        self.layout_toolbar_filters.addSpacing(15)
        self.layout_toolbar_filters.addWidget(self.filter_add_param)
        self.layout_toolbar_filters.addWidget(self.checkbox_add_param)

# +
        self.layout_main_window.addLayout(self.layout_toolbar_buttons)      # +
        self.layout_toolbar.addLayout(self.layout_toolbar_filters)
#        self.layout_toolbar.addLayout(self.layout_toolbar_buttons)
        self.layout_main_window.addLayout(self.layout_toolbar)

        # конфигурация таблицы
        self.layout_table = QHBoxLayout()
        self.table = QTableWidget()
        self.table.setColumnCount(9)
        self.table.setRowCount(13500)
        self.table.setHorizontalHeaderLabels(
            ['№', 'Дата и время', 'БКУ', 'КЛ', 'АУ', 'Канал', 
            'Код события', 'Доп. параметр', 'Описание'])
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.horizontalHeader().setVisible(True)
        for col in range(8):
            self.table.setColumnWidth(col, 100)
        self.table.setColumnWidth(1, 300)

# ???    self.table_alignment = AlignDelegate(self.table)     # ? AlignDelegate
# ???    self.table.setItemDelegate(self.table_alignment)     # ?
        self.layout_table.addWidget(self.table)
        self.layout_main_window.addLayout(self.layout_table)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    
    app.setStyle('Fusion')                                 # <-- ВАЖНО # !!! +++
    
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

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

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