带有tableview的C ++ Qt QComboBox

时间:2016-11-25 07:05:53

标签: c++ qt

我的QComboBox有问题。我需要一个带有tableview项目的组合框。

例如,QComboBox的默认值为:

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

我需要像这样创建ComboBox:

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++;
}

我编写了示例,但它无法正常工作:

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());
}

问题是 - 如果我选择索引3,ComboBox将设置索引2。

编辑:

$('.btn').click(function() {
    $('#modal1').modal();

});

$('#modal1 .btn-primary').click(function(){

    $('#modal1').modal('hide');

   var returnedvalue = $('#modalvalue').val();
    $('#Response').text(returnedvalue);
    $('#modal2').modal();
})

这是工作。但我不知道这是多么正确?

2 个答案:

答案 0 :(得分:2)

您应该使用setModelColumn(),因为QComboBox一次只显示一列。

像这样:

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

答案 1 :(得分:1)

不确定是否存在该循环中的原因,但这种方式更具可读性且可能没有错误:

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

如果变化,则将幻数2替换为列数。

我认为,ComboBox使用表的行代替item并显示第一个元素,这需要研究。如果选择index0或index1,它会怎么做?

编辑:是的,发生了什么事。无论有多少列,组合框都会从表中接收行(记录号)。我认为您需要为QTableView创建自定义委托,是的,更改模型列。另一种方法是使用单列模型创建QTableView的模拟