QComboBox阵列访问

时间:2014-06-04 12:18:06

标签: c++ arrays qt iterator qcombobox

我希望能够访问我的QComboBox中的值,而无需使用itemText循环访问内容。

for( auto i = 0u; i < myQComboBox->count(); i++ )
{
    result[i] = myQComboBox->itemText( i );
}

有没有办法可以访问QComboBox的底层QList,这样我就可以使用operator[]甚至更好的,迭代器和基于范围的循环?

2 个答案:

答案 0 :(得分:4)

您似乎对语法感兴趣:您想要将myQComboBox->itemText(i)替换为myQComboBox[i]。这可以很容易地完成:

// implementation
class ModelAdapter {
  QPointer<QAbstractItemModel> m_model;
public:
  explicit ModelAdapter(QComboBox & box) : m_model(box.model()) {}
  explicit ModelAdapter(QAbstractItemModel * model) : m_model(model) {}
  QVariant operator[](int i) { return m_model->index(i, 0); }
};

// point of use
ModelAdapter model(myQComboBox);
for( auto i = 0; i < myQComboBox->count(); i++ )
{
    result[i] = model[i];
}

使用良好的编译器,您可以执行以下操作,并使其生成与您直接使用combobox.model->index(i, 0)相同的代码。我没有看到它的重点,但是,嘿,这是可能的:)

// implementation
class Adapter {
  QAbstractItemModel* m_model;
public:
  explicit Adapter(QComboBox & box) : m_model(box.model()) {}
  explicit Adapter(QAbstractItemModel * model) : m_model(model) {}
  QVariant operator[](int i) { return m_model->index(i, 0); }
};

// point of use
for( auto i = 0; i < myQComboBox->count(); i++ )
{
    result[i] = Adapter(myQComboBox)[i];
}

类似的适配器可以为您提供迭代器。

答案 1 :(得分:3)

您可以使用组合框的模型检索项目数据。这是一个例子,我将如何做到这一点:

QComboBox combo;
combo.addItem("Item 1");

QAbstractItemModel *model = combo.model();
QModelIndex idx = model->index(0, 0); // Refers to the first item
QString item = model->data(idx).toString(); // Returns 'Item 1'

要访问组合框的第二个和更多项,只需更改index()函数调用中的行号:

QModelIndex idx = model->index(0, 0);
                the row number ^

到目前为止,我还没有发现任何基于组合框的基于迭代器的API,但你可以使用QAbstractItemModel的所有优势。

相关问题