Python-сообщество
![]()
- Начало
- » GUI
- » pyqt5 получить значение QComboBox
#1 Авг. 1, 2020 12:36:52
Pacifist Зарегистрирован: 2020-01-10 Сообщения: 25 Репутация: 0 Профиль Отправить e-mail
pyqt5 получить значение QComboBox
Как в label получить значение из comboBox (словаря)? При выборе в comboBox Яблоко — в label должно быть 5
import sys from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(509, 137) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.comboBox = QtWidgets.QComboBox(self.centralwidget) self.comboBox.setGeometry(QtCore.QRect(40, 50, 171, 22)) self.comboBox.setObjectName("comboBox") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(320, 50, 121, 21)) self.label.setStyleSheet("background-color: rgb(110, 166, 255);") self.label.setText("") self.label.setObjectName("label") MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) list_name = 'Яблоко': 5, 'Дыня': 6, 'Груша': 7, 'Вишня': 9> class Proba(QtWidgets.QMainWindow): def __init__(self): super(Proba, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.comboBox.addItems(list_name) value = self.ui.comboBox.currentData() self.ui.label.setText(str(value)) app = QtWidgets.QApplication([]) application = Proba() application.show() sys.exit(app.exec())
#2 Авг. 1, 2020 13:36:56
rami Зарегистрирован: 2018-01-08 Сообщения: 279 Репутация: 71 Профиль Отправить e-mail
pyqt5 получить значение QComboBox
class Proba(QtWidgets.QMainWindow): def __init__(self): super(Proba, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.comboBox.addItems(list_name) self.ui.comboBox.currentIndexChanged[str].connect(self.text_to_label) def text_to_label(self, item_selected): self.ui.label.setText(str(list_name[item_selected]))
Остальное как у вас.
Qcombobox как достать значения
На этом шаге рассмотрим класс QComboBox.
Класс QComboBox предоставляет пользователю возможность выбора одного элемента из нескольких. Его функциональное назначение совпадает с виджетом простого списка QListWidget. Основное преимущество выпадающего списка состоит в отображении только одного (выбранного) элемента, благодаря чему для его размещения не требуется много места. Отображение всего списка (раскрытие) происходит только на некоторый промежуток времени, чтобы пользователь мог сделать выбор, а затем список возвращается в свое исходное состояние (сворачивается).
В качестве элемента можно добавить текст и/или картинку. Для этого служит метод addItem(). Можно добавить сразу несколько текстовых элементов, передав указатель на объект класса QStringList в метод addItems().
Вызвав метод setDuplicatesEnabled(false), можно включить режим, исключающий повторяющиеся элементы из списка. Если необходимо удалить все элементы выпадающего списка, тогда вызывается слот clear().
Чтобы узнать, какой из элементов является текущим, нужно вызывать метод currentIndex(), который возвратит его порядковый номер.
Можно сделать так, чтобы пользователь мог сам добавлять элементы в список. Типичным примером этого является адресная строка Проводника ОС Windows, содержащая в себе список просмотренных адресов (ссылок). Для установки виджета в этот режим вызывается метод setEditable() с параметром true. После того как пользователь изменил текст выбранного элемента, отправляется сигнал editTextChanged(const QString&), и новый элемент добавляется в список.
После выбора элемента отправляются сразу два сигнала activated() — один с параметром типа int (индексом выбранного элемента), а другой с параметром типа const QString& (его значением). Эти сигналы отправляются, даже если пользователь выбрал ранее выбранный элемент; для информирования о реальном изменении служат два сигнала currentIndexChanged(), также отправляемые с параметрами int и const QString& каждый.
Пример, приведенный на рис. 1, демонстрирует виджет выпадающего списка. При изменении элемента список дополнится новым элементом.
Рис.1. Пример выпадающего списка
Рассмотрим текст приложения:
QComboBox cb; QStringList lst; lst cb.addItems(lst); cb.setEditable(true); cb.show();
Файлы приложения можно взять здесь.
Пример, приведенный на рис. 2, демонстрирует виджет выпадающего списка, в качестве элементов используются растровые изображения и текст.
Рис.2. Пример выпадающего списка с картинками
Рассмотрим текст приложения:
QComboBox cb; QStringList lst; lst foreach(QString str, lst) < cb.addItem(QIcon(str+".jpg"),str, Qt::UserRole); > cb.setIconSize(QSize(60,60)); cb.show();
Файлы приложения можно взять здесь.
Пример, приведенный на рис. 3, демонстрирует применение сигнала activated(int) выпадающего списка. В примере требуется ввести два числа и выбрать из списка действие над ними.
Рис.3. Пример использования выпадающего списка
Для реализации этого приложения описали следующий класс:
class cb:public QWidget < Q_OBJECT private: QStringList lst; QLabel *l,*l1,*l2; QLineEdit *a,*b; QComboBox *cbox; FileNameValidator *pnameValidator1,*pnameValidator2; public: cb(QWidget *parent=0); private slots: void schet(); >;
Конструктор реализован следующим образом:
cbox=new QComboBox(); l=new QLabel("Результат: "); l1=new QLabel("Введите первое число: "); l2=new QLabel("Введите второе число: "); a=new QLineEdit("10"); pnameValidator1 = new FileNameValidator(a); a->setValidator(pnameValidator1); l1->setBuddy(a); b=new QLineEdit("2"); pnameValidator2 = new FileNameValidator(b); b->setValidator(pnameValidator2); l2->setBuddy(b); lst cbox->addItems(lst); cbox->setCurrentIndex(0); float ax,bx,res; ax=a->text().toFloat(); bx=b->text().toFloat(); res=ax+bx; l->setText(l->text()+QString::number(res)); connect(cbox,SIGNAL(activated(int)),this,SLOT(schet())); connect(a,SIGNAL(textChanged(QString)),this,SLOT(schet())); connect(b,SIGNAL(textChanged(QString)),this,SLOT(schet())); QVBoxLayout *phbl1=new QVBoxLayout; phbl1->setMargin(5); phbl1->setSpacing(15); phbl1->addWidget(l1); phbl1->addWidget(a); phbl1->addWidget(l2); phbl1->addWidget(b); phbl1->addWidget(l); QHBoxLayout *pvbl=new QHBoxLayout; pvbl->setMargin(5); pvbl->setSpacing(15); pvbl->addWidget(cbox); pvbl->addLayout(phbl1); setLayout(pvbl);
Слот schet() выполняет с введенными числами выбранное в списке действие:
l->setText("Результат: "); if((a->text()!="")&&(b->text()!="")) < float ax,bx,res; ax=a->text().toFloat(); bx=b->text().toFloat(); if(cbox->currentIndex()==0) < res=ax+bx; l->setText(l->text()+QString::number(res)); > else if(cbox->currentIndex()==1) < res=ax-bx; l->setText(l->text()+QString::number(res)); > else if(cbox->currentIndex()==2) < res=ax*bx; l->setText(l->text()+QString::number(res)); > else < if(bx!=0) < res=ax/bx; l->setText(l->text()+QString::number(res)); > else l->setText(l->text()+" Делить на 0 нельзя"); > >
Защита от неверного ввода реализована следующим классом:
class FileNameValidator : public QValidator < public: FileNameValidator(QObject* parent) : QValidator(parent) < >virtual State validate(QString& str, int& pos) const < QRegExp rxp = QRegExp("[^0-9.]"); if (str.contains(rxp)) < return Invalid; >else return Acceptable; > >;
Файлы приложения можно взять здесь.
На следующем шаге рассмотрим класс QTabWidget.
unixforum.org
Индексы всё равно будут с 0 и по порядку. Для того, чтобы связать с пунктом какое-то значение придумали userData. insertItem() можете спокойно заменить на addItem(). А вот то самое QVariant Вам и нужно, то что тут указано добавляется с ролью Qt::UserRole. Получить userData по индексу: itemData(), по данным узнать индекс: findData().
Спасибо сказали:
IMB Сообщения: 2556 ОС: Debian
Re: Qt: комбобокс с определёнными индексами
Сообщение IMB » 15.05.2011 23:05
Хм, не затруднит привести пример кода, а то как-то из документации не совсем понял механизм?
Мне необходимо внести в QComboBox три пукта — point1 с индеком 1, point2 с индексом 2 и point3 с индексом 3. Больше ничего в QComboBox отображаться не должно.
Индекс должен участвовать в дальнейших действиях, как-то изменение интерфейса:
switch (index) < case 1: ui->wdr_point2->setEnabled(false); ui->wdr_point3->setEnabled(false); break; case 2: ui->wdr_point2->setEnabled(true); ui->wdr_point3->setEnabled(false); break; case 3: ui->wdr_point2->setEnabled(true); ui->wdr_point3->setEnabled(true); break; >
Спасибо сказали:
NickLion Сообщения: 3408 Статус: аватар-невидимка ОС: openSUSE Tumbleweed x86_64
Re: Qt: комбобокс с определёнными индексами
Сообщение NickLion » 15.05.2011 23:24
Пожалуйста:
ui->wdr_mode->addItem( tr("point1"), QVariant(1) ); ui->wdr_mode->addItem( tr("point2"), QVariant(2) ); ui->wdr_mode->addItem( tr("point3"), QVariant(3) ); ui->wdr_mode->setCurrentIndex( 1 ); switch( ui->wdr_mode->itemData( ui->wdr_mode->currentIndex() ).toInt() )
Вместо QMessageBox().exec() вставляете что Вам надо.
Спасибо сказали:
IMB Сообщения: 2556 ОС: Debian
Re: Qt: комбобокс с определёнными индексами
Сообщение IMB » 15.05.2011 23:27
Дополнительной поиск привёл на http://www.forum.crossplatform.ru/lofivers. php/t5263.html
Насколько я понял — добавление было выполнено корректно, а обработка нет.
Привёл обработку к виду:
int num = ui->wdr_mode->itemData(index, Qt::UserRole).toInt(); switch (num) < case 1: .
Спасибо сказали:
IMB Сообщения: 2556 ОС: Debian
Re: Qt: комбобокс с определёнными индексами
Сообщение IMB » 09.06.2011 09:56
Возникла проблема с установкой определённого значения комбобокса на основании внешних данных.
При нажатии на кнопку считывается значение комбобокса и отправляется на сервер:
void MainWindow::on_wdr_set_mode_clicked() < send_command(COMMAND_WDR_SET_MODE, ui->wdr_mode->itemData(ui->wdr_mode->currentIndex(), Qt::UserRole).toInt()); >
Ту вроде проблем нет.
В ответ на другую команду сервер должен вернуть текущий режим работы WDR, который необходимо отобразить в комбобоксе:
ui->wdr_mode->setItemData(data[0], QVariant(data[0]), Qt::UserRole);
Получить значение QComboBox из QTableWidget из другого метода, где строки таблицы создаются по нажатию кнопки и получить значение по адресу ячейки
У меня в таблице QTableWidget строки создаются по нажатию кнопки, где внутри ячейки помещаю QComboBox, и хочу получить значение QComboBox из другого метода. Проблема в том, что когда я создаю QComboBox в основном классе окна, у меня при клике не создается несколько QComboBox, а только в последней строке. А когда создаю внутри метода когда нажимаю кнопку могу создать несколько QComboBox, но не могу обратится к QComboBox по адресу ячейки в QTableWidget. Ниже я привел мой код, где строки и стоблцы создаются по клику на кнопку, где я пытался обратится через метод QTableWidget.cellWidget(1, 1), но у меня просто вылетает программа без TraceBack.
import sys from PyQt5 import QtWidgets from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout class MyWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super().__init__() self.centralWidget = QWidget() self.setCentralWidget(self.centralWidget) self.row_count = 1 self.table_index = 0 self.tableWidget = QtWidgets.QTableWidget() self.tableWidget.setRowCount(0) self.tableWidget.setColumnCount(2) self.button = QtWidgets.QPushButton('Добавить строки таблицы') self.button_1 = QtWidgets.QPushButton('Вывести значение ячейки') self.layout = QVBoxLayout(self.centralWidget) self.layout.addWidget(self.tableWidget) self.layout.addWidget(self.button) self.layout.addWidget(self.button_1) self.button.clicked.connect(self.add_cells) self.button_1.clicked.connect(self.print_cells) def add_cells(self): # метод для добавления строки и ячеек self.tableWidget.setRowCount(self.row_count) self.tableWidget.setItem(self.table_index, 0, QtWidgets.QTableWidgetItem('Nokia')) combobox = QtWidgets.QComboBox() # Создаю combobox combobox.addItem('Продано') combobox.addItem('В наличии') self.tableWidget.setCellWidget(self.table_index, 1, combobox) self.row_count += 1 self.table_index += 1 def print_cells(self): print(self.tableWidget.item(0, 0).text()) print(self.tableWidget.cellWidget(1, 1).text()) # Запрос значения из ComboBox (вылетает ошибка) if __name__ == '__main__': app = QApplication(sys.argv) w = MyWindow() w.show() sys.exit(app.exec_())