我希望能够访问我的QComboBox中的值,而无需使用itemText
循环访问内容。
for( auto i = 0u; i < myQComboBox->count(); i++ )
{
result[i] = myQComboBox->itemText( i );
}
有没有办法可以访问QComboBox的底层QList,这样我就可以使用operator[]
甚至更好的,迭代器和基于范围的循环?
答案 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
的所有优势。