添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在开发过程中,经常看别的软件有这么个场景。在下拉菜单中显示的是中文名称,但是后台数据却用的是编码。比如操作员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 &amp;))); 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方法。你可以根据自己的需求修改这些方法的实现。