在开发过程中,经常看别的软件有这么个场景。在下拉菜单中显示的是中文名称,但是后台数据却用的是编码。比如操作员combobox,选中的名称是“小明”,但是保存数据库需要用小明的Id/Number,这时候我们就要通过小明然后对应到Id/Number。
那Qt中ComboBox当然不能少了这个功能。QComboBox可以设置Item的Data,然后根据你选择的某一项可以对应到这个Data上。
先定义好自己的数据结构 MyData
#ifndef MYDATA_H
#define MYDATA_H
#include <QObject>
class MyData : public QObject
Q_OBJECT
public:
explicit MyData(QObject *parent = nullptr);
virtual ~MyData();
MyData(const int iId,
const QString strNumber,
const QString strName,
QObject *parent = nullptr)
: QObject(parent),
m_iId(iId),
m_strNumber(strNumber),
m_strName(strName)
MyData(const MyData &data, QObject *parent = nullptr)
: QObject(parent)
m_iId = data.GetId();
m_strNumber = data.GetNumber();
m_strName = data.GetName();
MyData &operator = (const MyData &data)
if (this == &data)
return *this;
m_iId = data.GetId();
m_strNumber = data.GetNumber();
m_strName = data.GetName();
return *this;
friend bool operator == (const MyData &lhs, const MyData &rhs)
return (lhs.GetId() == rhs.GetId()
&& lhs.GetNumber() == rhs.GetNumber()
&& lhs.GetName() == rhs.GetName());
friend bool operator != (const MyData &lhs, const MyData &rhs)
return !(lhs.GetId() == rhs.GetId()
&& lhs.GetNumber() == rhs.GetNumber()
&& lhs.GetName() == rhs.GetName());
signals:
public slots:
private:
int m_iId;
QString m_strNumber;
QString m_strName;
public:
int GetId() const { return m_iId; }
void SetId(const int iId) { m_iId = iId; }
QString GetNumber() const { return m_strNumber; }
void SetNumber(const QString &strNumber) { m_strNumber = strNumber; }
QString GetName() const { return m_strName; }
void SetName(const QString &strName) { m_strName = strName; }
Q_DECLARE_METATYPE(MyData)
#endif // MYDATA_H
#include "mydata.h"
MyData::MyData(QObject *parent) : QObject(parent)
MyData::~MyData()
然后用QVariant包装自定义数据。
然后采用ComboBox的addItem(...)方法。
具体代码片段:
void Widget::LoadDataToComboBox()
ui->comboBox->clear();
for (auto data : m_dataList)
QVariant var;
var.setValue(*data);
ui->comboBox->addItem(data->GetName(), var);
connect( ui->comboBox,
SIGNAL(currentIndexChanged(int)),
this,
SLOT(onComboBoxIndexChangeSlot(int)) );
从QComboBox取数据。
具体代码片段:
void Widget::onComboBoxIndexChangeSlot(int iIndex)
MyData mydata = ui->comboBox->itemData(iIndex).value<MyData>();
QString strText = QString("数据:\nId:%1\nName:%2\nNumber:%3")
.arg(mydata.GetId())
.arg(mydata.GetName())
.arg(mydata.GetNumber());
QMessageBox::information(this, "提示", strText);
以上就是QComboBox绑定自定义结构数据的关键代码。
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "mydata.h"
#include <QWidget>
namespace Ui {
class Widget;
class Widget : public QWidget
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QList<MyData *> m_dataList;
private:
void Initialize();
void CreateComboBoxData();
void LoadDataToComboBox();
public slots:
void onComboBoxIndexChangeSlot(int iIndex);
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QListView>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui->setupUi(this);
Initialize();
Widget::~Widget()
delete ui;
if (!m_dataList.isEmpty())
const int iCnt = m_dataList.count();
for (int i = 0; i < iCnt; ++i)
delete m_dataList[i];
m_dataList[i] = NULL;
QList<MyData *> empty;
empty.swap(m_dataList);
void Widget::Initialize()
ui->comboBox->setStyleSheet("QComboBox { min-height: 30px; min-width: 60px; }"
"QComboBox QAbstractItemView::item { min-height: 30px; min-width: 60px; }");
ui->comboBox->setView(new QListView());
CreateComboBoxData();
LoadDataToComboBox();
void Widget::CreateComboBoxData()
for (int i = 0; i < 5; ++i)
MyData *pMydata = new MyData(i + 1,
QString("00%1").arg(i + 1),
QString("%1号").arg(i + 1));
m_dataList.push_back(pMydata);
void Widget::LoadDataToComboBox()
ui->comboBox->clear();
for (auto data : m_dataList)
QVariant var;
var.setValue(*data);
ui->comboBox->addItem(data->GetName(), var);
connect( ui->comboBox,
SIGNAL(currentIndexChanged(int)),
this,
SLOT(onComboBoxIndexChangeSlot(int)) );
void Widget::onComboBoxIndexChangeSlot(int iIndex)
MyData mydata = ui->comboBox->itemData(iIndex).value<MyData>();
QString strText = QString("数据:\nId:%1\nName:%2\nNumber:%3")
.arg(mydata.GetId())
.arg(mydata.GetName())
.arg(mydata.GetNumber());
QMessageBox::information(this, "提示", strText);
demo下载地址点击打开链接
在开发过程中,经常看别的软件有这么个场景。在下拉菜单中显示的是中文名称,但是后台数据却用的是编码。比如操作员combobox,选中的名称是“小明”,但是保存数据库需要用小明的Id/Number,这时候我们就要通过小明然后对应到Id/Number。 那Qt中ComboBox当然不能少了这个功能。QComboBox可以设置Item的Data,然后根据你选择的某一项可以对应到这个Data上...
文章目录问题处理办法-强制转换
在MFC界面编程时,使用CComboBox对象,习惯于将一个固定的对象绑定到每个CComboBox Item上,当需要使用对象的数据时,取出指针即可。
在QComboBox中,绑定是通过void setItemData(
int index, const QVariant &value, int role = Qt::UserRole)实现的。取数据是通过
QVariant QComboBox::itemData(int index, int role = Qt
QComboBox是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个 QLineEdit 用作输入。QComboBox 除了显示可见下拉列表外,每个项(item,或称列表项)还可以关联一个 QVariant 类型的变量,用于存储一些不可见数据。
2.常用方法
添加带图标的项
QIcon icon;
icon.addFile(":/images/icon.jpg");
ui->comboBox->addI....
1.利用addItem方法就可以(动态添加)
这种方法适合动态添加,即添加的数据会随运行的程序改变而改变
例如在ui里拖了一个combobox,然后再在一些方法中需要用到的时候添加如下代码(假设这里的combobox的名字为cbxConnection,要添加的字符串为s)
ui->cbxConnection->addItem(s);
就可以动态添加代码了
如下:这里的cbxconnection是只有两个选项
当我客户端发了一条消息之后:
Qt 实现两个Combo Box关联(Qt学习笔记)城市的下拉框会随着省份的选择而改变代码实现部分
城市的下拉框会随着省份的选择而改变
中文乱码+常量中有换行符问题可参考链接: link.
实现如图:
代码实现部分
添加ProvinceBox的槽,捕捉currentIndexChanged(int)信号
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESP
private void frmConfirmInvoice_Load(object sender, EventArgs e)
ArrayList list = new ArrayList();
list.Add(new DictionaryEntry("A", "1"));
fromComboBox.addItem(rates) 添加一个下拉选项
fromComboBox.addItems(["%d years" % x for x in range(2, 26)]) 从序列中添加
fromComboBox.setMaxVisibleItems(10) #设置最...
for (int i=1;i<5;i++)
ui->ComBox->addItem(QString::number(i)+tr("元")); //添加新的item及其内容
ui->ComBox->addItem("自定义1");
ui->ComBox->addItem("自定义2");
0、效果1、创建comboQeury = new QComboBox;2、关联槽函数若当前选择项发生变化,则可以绑定下面的槽函数 connect(comboQeury, SIGNAL(currentIndexChanged(QString)), this, SLOT(ComboQueryCurTextChangedSlot(const QString &)));
class comBoxDelegate : public QStyledItemDelegate {
signals:
void comboxChanged(int para);
public slots:
void OnComboBoxChanged(int para)
emit comboxChanged(para);
1.1 QComBox简介
QComboBox 是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个 QLineEdit 用作输入。
QComboBox 除了显示可见下拉列表外,每个项(item,或称列表项)还可以关联一个QVariant 类型的变量,用于存储一些不可见数据。
QComboBox *combo = new QComboBox(); // 下拉选择框
combo->addItem(tr("第
可以使用PyQt5的信号槽机制,将QComboBox的currentIndexChanged信号与按钮的clicked信号连接起来,实现这个绑定按钮事件的功能。具体的代码如下:
```python
from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QPushButton, QVBoxLayout
class MyWidget(QWidget):
def __init__(self):
super().__init__()
# 创建组件
self.comboBox = QComboBox()
self.comboBox.addItems(['选项1', '选项2', '选项3'])
self.button = QPushButton('按钮')
# 创建布局
layout = QVBoxLayout()
layout.addWidget(self.comboBox)
layout.addWidget(self.button)
self.setLayout(layout)
# 连接信号槽
self.comboBox.currentIndexChanged.connect(self.on_combobox_changed)
self.button.clicked.connect(self.on_button_clicked)
# 当下拉框选项改变时触发
def on_combobox_changed(self, index):
print('选中了第{}个选项'.format(index))
# 当按钮被点击时触发
def on_button_clicked(self):
print('按钮被点击了')
if __name__ == '__main__':
app = QApplication([])
widget = MyWidget()
widget.show()
app.exec_()
在这个代码中,我们先创建了一个QComboBox和一个QPushButton,并将它们添加到了一个QVBoxLayout中。然后,我们将QComboBox的currentIndexChanged信号与on_combobox_changed方法连接起来,将按钮的clicked信号与on_button_clicked方法连接起来。当用户选中下拉框的某个选项时,就会触发on_combobox_changed方法,当用户点击按钮时,就会触发on_button_clicked方法。你可以根据自己的需求修改这些方法的实现。