2016-11-25 32 views
6

我有QComboBox的問題。我需要一個帶有桌面視圖項目的組合框。C + + Qt QcomboBox與桌面視圖

例如,QComboBox的默認值是:

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

我需要這樣的創建組合框:

┌───────────────────┐ 
│     ▼ │ 
├─────────┬─────────┤ 
│ 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.

編輯:

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()是可行的,但你的代碼不能編譯。我在主要問題中寫了示例(編輯)。 –

1

不知道原因有在循環,但這種方式更易於閱讀和可能的無差錯:

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

與列數代替幻數2,如果發生變化。

我認爲,ComboBox使用表格的行而不是項目,並顯示第一個元素,這需要研究。如果選擇index0或index1,它會發揮什麼作用?

編輯:是的,那是怎麼回事。無論有多少列,組合框都會從表中接收行(記錄號)。我認爲你需要爲QTableView創建一個自定義的委託,是的,改變模型列。另一種方法是用單列模型創建QTableView的模擬