Сделать ссылку на combobox pyqt currentindex

PyQt – QCombobox в лист

Я показываю данные из базы данных SQLite в QTableView, используя QSqlTableModel. Разрешение пользователю редактировать эти данные работает нормально. Однако для некоторых столбцов я хочу использовать QComboboxes вместо свободных текстовых ячеек, чтобы ограничить список возможных ответов.

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

Вот полный мини-пример:

В этом случае я хочу использовать QCombobox в столбце “Company”. Он должен отображаться все время, поэтому я звоню openPersistentEditor.

Проблема 1: значения по умолчанию я ожидал бы, что это показывает содержимое не редактируемого поля, когда оно не редактируется (т. е. компания, как она указана в модели), но вместо этого она, по-видимому, показывает I-й элемент выбора combobox. Как я могу заставить каждый combobox показывать фактическое содержимое модели для этого поля по умолчанию?

Проблема 2: редактирование когда вы комментируете “self.fill_table()”, вы можете проверить, поступают ли изменения в базу данных SQL. Я ожидаю, что выбор любого поля в раскрывающемся списке заменит исходное значение. Но (а) я должен сделать каждый выбор дважды (в первый раз значение, отображаемое в ячейке, остается неизменным), и (Б) данные появляются в модели странно (изменение первого столбца на ‘VW’, ‘Honda’, ‘Honda’ приводит к (‘1’, ‘VW’, ‘1’ в модели). Я думаю, это потому, что код использует editor.currentIndex() в делегате setModelData, но я не нашел способа использовать содержимое редактора вместо этого. Как я могу заставить код правильно сообщать о выборе пользователя обратно в модель? (И как я могу сделать эту работу на первый клик, вместо необходимости 2 кликов?)

Любая помощь очень ценится. (Я прочитал документацию по QAbstractItemDelegate, но не нахожу ее особенно полезной.)

1 Ответ

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

Я надеюсь, что это поможет кому-то в будущем.

Похожие вопросы:

Можно ли отключить QComboBox в pyqt, как мы можем сделать это в Win Forms(C#), так как я не смог найти никакой опции в руководстве QComboBox . Я хочу включить QcomboBox только при входе.

В моем окне PyQT у меня есть таблица, содержащая QComboBox в одном столбце. Как можно изменить QComboBox позже на обычный QTableWidgetItem для отображения некоторого текста? Я попробовал следующее.

Я работаю над приложением в PyQt, которое принимает словарь объектов и позволяет вам строить переменные, потоковые из робота в реальном времени. Одна из вещей, над которыми я работаю, чтобы включить.

У меня возникли проблемы с изменением цвета подсветки QCombobox в PyQt. Мне удалось изменить цвет подсветки фактического поля ввода, но когда появляется выпадающее меню, оно все еще синее. На.

Я нашел несколько отличных примеров PyQt4 QComboBox с автозаполнением (например, как фильтровать элементы PyQt QCombobox на основе ввода текста? ), но все они используют setModel и setSourceModel.

Я не могу заставить QComboBox::findData работать должным образом в моем приложении PyQt. Похоже, что PyQt не сравнивает QVariant с Python кортежами должным образом, в результате чего Qt не находит.

В одном из моих приложений мне нужно иметь QComboBox внутри QTableWidget. Я написал этот код: def on_addGoal_clicked(self, checked=False).

Я хочу использовать QComboBox с keys и values из кортежа, аналогичного тем, которые используются в моделях a django. Например, у меня есть следующая структура для пола человека. SEX_CHOICES = ((‘M’.

Есть ли что-то похожее на (PyQT) QTreeWidgetItem.setCheckState(0, Qt.Checked) но для поля со списком? Я ничего не вижу в ссылке, поэтому как я могу вставить пользовательский QComboBox в качестве.

Я использую Qt Designer для построения своего макета UI. На макете у меня есть combobox с именем cb_fac_cd . В моем коде есть функция, которая автоматически построит combobox на основе списка.

Читать еще:  Как из видео сделать гифку в фотошопе

сделать ссылку на combobox pyqt currentindex

ВАЖНО! Для того, что бы сохранить статью в закладки, нажмите: CTRL + D

Задать вопрос ВРАЧУ, и получить БЕСПЛАТНЫЙ ОТВЕТ, Вы можете заполнив на НАШЕМ САЙТЕ специальную форму, по этой ссылке >>>

используя pyqt4 и python 2.6, я использую qcombobox для предоставления списка опций. У меня проблемы с использованием выбранного варианта. я смог использовать сигнал для запуска метода при выборе опции, но проблема заключается в том, что при использовании щелчков мыши использование нескольких из этих списков должно быть учтено. поэтому в основном мне нужно получить выбранное содержимое combobox в виде строки. до сих пор я только мог использовать это:

чтобы получить следующее:

когда все, что я действительно хочу, это бит «Test Selection», любые идеи? мой поле со списком было сделано следующим образом:

Вы можете преобразовать тип QString в строку python, просто используя str функция. Предполагая, что вы не используете символы Unicode, вы можете получить python строка, как показано ниже:

Если вы используете символы юникода, вы можете:

PyQt4 может быть вынужден использовать новый API, в котором QString автоматически преобразуется в объект Python и из него:

A QComboBox object presents a dropdown list of items to select from. It takes minimum screen space on the form required to display only the currently selected item.

A Combo box can be set to be editable; it can also store pixmap objects. The following methods are commonly used −

Given below are the most commonly used methods of QComboBox.

Adds string to collection

Adds items in a list object

Deletes all items in the collection

Retrieves number of items in the collection

Retrieves the text of currently selected item

Displays text belonging to specific index

Returns index of selected item

Changes text of specified index

QComboBox Signals

When the user chooses an item

Whenever the current index is changed either by the user or programmatically

When an item in the list is highlighted

Let us see how some features of QComboBox widget are implemented in the following example.

Items are added in the collection individually by addItem() method or items in a List object by addItems() method.

QComboBox object emits currentIndexChanged() signal. It is connected to selectionchange() method.

Items in a combo box are listed using itemText() method for each item. Label belonging to the currently chosen item is accessed by currentText() method.

The entire code is as follows −

The above code produces the following output −

бла-бла-бла создавать comboBox как переменную создаваемого объекта OpenFile:

тогда в методе showDialog можно обратится к self.comboBox:

бла-бла-бла узнать его индекс можно методом currentIndex()

бла-бла-бал отдельным методом бла-бла-бла.
____________________________________________________________________________________________
дополнение к ответу:
подытожим: мы уже заменили все comboBox на self.comboBox (вы ведь так сделали ?)
убрали к (недружелюбное слово) sheetName и цикл его заполнения. (зачем он вам если у вас есть отличный comboBox?)
так же сам wbr нам тоже придётся сделать «долгоиграющей» переменной (мы его будем использовать в нашем «отдельном» методе, поэтому потерять его будет катастрофой. )

т.е довели метод def showDialog(self):
до след. 3-х строчек:
filename = QtGui.QFileDialog.getOpenFileName(self, ‘Выбор файла’, ‘*xls’)
self.wbr = xlrd.open_workbook(filename, formatting_info=True)
self.comboBox.addItems(self.wbr.sheet_names())

Что же делать со всем этим кодом ниже?
ну можно сделать ещё одну кнопочку «писать_в_csv» и метод-слот для вашего кода.
пример для связи кнопки и метода уже есть в вашем примере. нужно просто перед вашим кодом написать def вставте_суда_любое_название(self): и кнопку продублировать просто указать другое имя и другие координаты и там где connect поменять всё соответственно. И просто нажимать на кнопку после того как выберете лист.

Но мы же не ищем легких путей ведь так?
+ мы хотим познакомится с QT поближе.
наш тру вариант без участия дополнительной кнопки:
метод я назвал slot_list_selected. и мы его соединим непосредственно с сигналом изменения combobox-а так:
self.comboBox.currentIndexChanged.connect(self.slot_list_selected) — это альтернативный более коротки метод связывания сигналов и слотов (чем self.connect(self.comboBox, QtCore.SIGNAL(‘currentIndexChanged(int)’), self.slot_list_selected) )
но есть запарка — сигнал не только вызывает метод но и передает ему int (выбранный индекс). Значит наш слот-метод должен его принимать.
def slot_list_selected(self, list_index):
ну и так как он нам всё равно передается мы могли бы его сразу использовать.
заместо sheet = self.wbr.sheet_by_index(self.comboBox.currentIndex())
sheet = self.wbr.sheet_by_index(list_index)
в принципе дальше ваш магический код вроде прекрасно работает. но он будет вызыватся в момент когда мы заполняем наш comboBox (изначально пустой combo показывает «-1», а когда заполняем его значение становится «0» что вызывает сигнал currentIndexChanged)
это решается выключением сигналов коммандой self.comboBox.blockSignals(True)
Но и тут вылезут подводные камни: в частности по умолчанию выберется первый элемент(с индексом 0) и попытавшись его выбрать индекс не изменится.
тут опять 2 выхода:
1) сделать первым итемом не имя листа а свой собственный. (если его ещё и назвать «выберите лист», то это будет служить дополнительной подсказкой для пользователя.)

Читать еще:  Прическа дина винчестера как сделать

переписываем self.comboBox.addItems(self.wbr.sheet_names()) на
self.comboBox.addItems([«выберите лист»] + self.wbr.sheet_names())
т.к. индексы сместились то и sheet вычисляем с индексом -1:
sheet = self.wbr.sheet_by_index(list_index-1)
и придется делать проверку на то что list_index больше нуля. (мы же не хотим читать лист под номером «-1»)
if list_index:
ваш код.

вдоволь наигравшись с вашей программой замечаем что comboBox при выборе фаила заполняется но при этом не стирает предыдущие значения.
исправляем добавляя перед additems
self.comboBox.clear()

вроде бы всё хорошо.

2) более простой способ:
просто использовать сигнал activated вместо currentIndexChanged тогда оно будет реагировать даже на выбор уже выбранного. Но я всё равно рекомендую проделать операции из первого способа.

Мы продолжим знакомство с виджетами PyQt5.

Мы обсудим QPixmap, QLineEdit, QSplitter и QComboBox.

QPixMap – это один из виджетов, использующихся для работы с изображениями. Он оптимизирован для показа изображений на экране. В приведенном ниже примере, мы будем использовать QPixMap для того, чтобы показать изображение в окне.

В нашем примере, мы показываем изображение в окне.

Мы создали объект QPixMap.

Мы поместили изображение в виджет QLabel.

QLineEdit – это виджет, который разрешает вводить и редактировать одну строку текста. Для этого виджета доступны функции «Отменить» и «Повторить», «Вырезать» и «Вставить», а также функция «перетаскивания».

Этот пример показывает виджет строки редактирования и метку. Текст, который мы вбиваем в строку редактирования, немедленно отображается в виджете метки.

Создается виджет QLineEdit.

Если текст в виджете редактирования строки меняется, мы вызываем метод onChanged().

Внутри метода onChanged, мы устанавливаем напечатанный текст в виджет метки. Мы вызываем метод adjustSize(), чтобы менять размер метки соответственно длине текста.

QSplitter позволяет пользователю контролировать размер виджетов путём перетаскивания границы между ними. В нашем примере, мы показываем три виджета QFrame, организованные с двумя разделителями.

В нашем примере, мы имеем три виджета фрейма и два разделителя. Обратите внимание, что в некоторых темах оформления, разделители могут не быть хорошо видимыми.

Для того, чтобы видеть границы между виджетами QFrame, мы используем стилизованный фрейм.

Мы создаём виджет QSplitter и добавляем в него два виджета.

К тому же, мы можем добавить разделитель к ещё одному виджету разделителя.

QComboBox – это виджет, который позволяет пользователю выбирать из списка вариантов (выпадающий список).

Пример показывает QComboBox и QLabel. Блок со списком имеет список из пяти вариантов. Это имена дистрибутивов Linux. Виджет метки показывает выбранный вариант.

Мы создаём виджет QComboBox с пятью вариантами.

После выбора пункта, мы вызываем метод onActivated().

Внутри метода, мы устанавливаем текст выбранного пункта в виджет метки. Мы приспосабливаем размер метки, как в прошлом примере.

В этой части руководства PyQt5, мы рассмотрели другие четыре виджета PyQt5.

Обсуждение вопросов, не связанных со статьёй (в т.ч. комментарии типа «Помогите!»), ведётся на форуме pythonworld.club, а не в комментариях.

Читать еще:  Установка окон по госту как правильно сделать

Для вставки кода на Python в комментарий заключайте его в теги

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

Что происходит?

Модель подключается к виджету списка. Это автоматом активирует отправку сигнала об изменении индекса текущей строки:

Поскольку на момент отправки сигнала свойство списка modelColumn по умолчанию установлено в 0 , то в подключенный слот отправляется значение, содержащееся в ячейке первой строки и первой колонки (нумерация, разумеется, производится с нуля).

Наконец устанавливается показываемая в списке колонка модели:

Здесь уже отправка сигнала об изменении текущего индекса строки не производится.

Как победить?

Если нет желания производить подключение сигнала к слоту после наполнения списка данными из модели, то можно поступить так.

Что не так со слотом?

Слот принимает строку в качестве аргумента, которая затем преобразуется в фильтр запроса к базе данных. Что произойдёт в том случае, если в таблице хранятся одинаковые строковые значения, но под разными идентификаторами?

Например, если таблица содержит имена, то два «Иван Иваныча» вовсе не такой уж редкий случай. Если таблица содержит названия населённых пунктов, то тем паче возможна ситуация полного совпадения.

Также следует помнить о том, что сравнение строк всегда медленнее, нежели чем сравнение чисел, и если таблица содержит большое количество записей, то вероятно довольно существенное проседание производительности. Впрочем, эта деталь — частный случай.

Как же иначе?

Можно использовать индекс текущей строки, а не её значение. Предположим, имеется таблица работников workers :

Тогда слот можно переписать на что-то иное:

Виджеты в PyQt5 (часть 2)

Мы продолжим знакомство с виджетами PyQt5.

Мы обсудим QPixmap, QLineEdit, QSplitter и QComboBox.

QPixMap

QPixMap – это один из виджетов, использующихся для работы с изображениями. Он оптимизирован для показа изображений на экране. В приведенном ниже примере, мы будем использовать QPixMap для того, чтобы показать изображение в окне.

В нашем примере, мы показываем изображение в окне.

Мы создали объект QPixMap.

Мы поместили изображение в виджет QLabel.

QLineEdit

QLineEdit – это виджет, который разрешает вводить и редактировать одну строку текста. Для этого виджета доступны функции “Отменить” и “Повторить”, “Вырезать” и “Вставить”, а также функция “перетаскивания”.

Этот пример показывает виджет строки редактирования и метку. Текст, который мы вбиваем в строку редактирования, немедленно отображается в виджете метки.

Создается виджет QLineEdit.

Если текст в виджете редактирования строки меняется, мы вызываем метод onChanged().

Внутри метода onChanged, мы устанавливаем напечатанный текст в виджет метки. Мы вызываем метод adjustSize(), чтобы менять размер метки соответственно длине текста.

QSplitter

QSplitter позволяет пользователю контролировать размер виджетов путём перетаскивания границы между ними. В нашем примере, мы показываем три виджета QFrame, организованные с двумя разделителями.

В нашем примере, мы имеем три виджета фрейма и два разделителя. Обратите внимание, что в некоторых темах оформления, разделители могут не быть хорошо видимыми.

Для того, чтобы видеть границы между виджетами QFrame, мы используем стилизованный фрейм.

Мы создаём виджет QSplitter и добавляем в него два виджета.

К тому же, мы можем добавить разделитель к ещё одному виджету разделителя.

QComboBox

QComboBox – это виджет, который позволяет пользователю выбирать из списка вариантов (выпадающий список).

Пример показывает QComboBox и QLabel. Блок со списком имеет список из пяти вариантов. Это имена дистрибутивов Linux. Виджет метки показывает выбранный вариант.

Мы создаём виджет QComboBox с пятью вариантами.

После выбора пункта, мы вызываем метод onActivated().

Внутри метода, мы устанавливаем текст выбранного пункта в виджет метки. Мы приспосабливаем размер метки, как в прошлом примере.

В этой части руководства PyQt5, мы рассмотрели другие четыре виджета PyQt5.

Источники:

http://coderoad.ru/51945016/PyQt-QCombobox-%D0%B2-%D0%BB%D0%B8%D1%81%D1%82

сделать ссылку на combobox pyqt currentindex

http://pythonworld.ru/gui/pyqt5-widgets2.html

Ссылка на основную публикацию
Статьи на тему: