2016-11-25 4 views
6

У меня проблема с QComboBox. Мне нужен combobox с элементами tableview.C++ Qt QComboBox with tableview

Например, по умолчанию QComboBox является:

┌─────────┐ 
│  ▼ │ 
├─────────┤ 
│ index 0 │ 
├─────────┤ 
│ index 1 │ 
├─────────┤ 
│ index 2 │ 
├─────────┤ 
│ index 3 │ 
└─────────┘ 

Мне нужно создать ComboBox вроде этого:

┌───────────────────┐ 
│     ▼ │ 
├─────────┬─────────┤ 
│ index 0 │ index 1 │ 
├─────────┼─────────┤ 
│ index 2 │ index 3 │ 
└─────────┴─────────┘ 

я написал образец, но он не работает правильно:

QTableView *table = new QTableView(this); 
QComboBox *cb = new QComboBox; 
ui->verticalLayout->addWidget(cb); 
cb->setView(table); 
QStandardItemModel *model = new QStandardItemModel(2,2); 
cb->setModel(model); 

int x = 0; 
int y = 0; 
for (int i=0; i<4; i++) 
{ 
    model->setItem(x, y, new QStandardItem("index" + QString::number(i))); 
    if (i == 1) { 
     x++; 
     y = 0; 
    } 
    else 
     y++; 
} 

Проблема в том, что если я выберу индекс 3, ComboBox установит индекс 2.

EDIT:

QTableView *table = new QTableView(this); 
QComboBox *cb = new QComboBox; 
ui->verticalLayout->addWidget(cb); 
cb->setView(table); 
QStandardItemModel *model = new QStandardItemModel(2,2); 
cb->setModel(model); 
for (int i=0; i<4; i++) 
    model->setItem(i%2, i/2, new QStandardItem("index" + QString::number(i))); 
// This one: 
connect(table, SIGNAL(pressed(QModelIndex)), SLOT(setCheckBoxIndex(QModelIndex))); 

//--SLOT-------- 
void MainWindow::setCheckBoxIndex(QModelIndex index) 
{ 
    QComboBox* combo = qobject_cast<QComboBox*>(sender()->parent()->parent()); 
    combo->setModelColumn(index.column()); 
    combo->setCurrentIndex(index.row()); 
} 

работа это. Но я не знаю, насколько это правильно?

+0

да ,, она работает, просто не воспользоваться моделью вида архитектуры. Был поток, который можно использовать QAbstractProxyModel для преобразования одноразмерной модели в двумерную таблицу, но у меня нет решения под рукой, высунув на него – Swift

ответ

2

Вы должны использовать setModelColumn(), потому что QComboBox покажет только одну колонку.

так:

connect(table, &QTableView::pressed, [cb](const QModelIndex &index){ 
    cb->setModelColumn(index.column()); 
}); 
+0

, который не компилируется. [cb] - это не вещь. Кроме того, следует помнить, что индекс в поле со списком будет по-прежнему индексом строки таблицы – Swift

+0

Спасибо! setModelColumn() - это работа, но ваш код не компилируется. Я написал образец (Edit) в основном вопросе. –

1

Не уверен, что если причина там в этом цикле, но таким образом, его более читабельным и, возможно, без ошибок:

for (int i=0; i<4; i++) 
{ 
    model->setItem(i%2, i/2, new QStandardItem("index" + QString::number(i))); 
} 

заменить магическое число 2 с подсчета столбца, если она меняется.

Я думаю, что ComboBox использует строку таблицы вместо элемента и отображает первый элемент, требующий исследования. Что он делает, если вы выберете index0 или index1?

EDIT: да, это то, что происходит. Независимо от того, сколько столбцов имеется, поле со списком получает строку (номер записи) из таблицы. Я думаю, что вам нужно создать пользовательский делегат для QTableView, и да, измените Model Column. Альтернативой является создание аналога QTableView с одной моделью столбца

Смежные вопросы