2016-11-25 28 views
6

QComboBox ile ilgili bir sorunum var. Tableview öğeleri ile bir combobox'a ihtiyacım var. Böyle ComboBox oluşturmak gerekC++ Qt QWboBox ile tablo görünümü

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

:

Örneğin, QComboBox varsayılan olan

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

Ben örnek yazdım, ancak doğru çalışmıyor:

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

Sorun şu ki - 3 numaralı indeksi seçtiğimde, ComboBox dizin 2'yi ayarlayacaktır.

DÜZENLEME:

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

It işi. Ama ne kadar doğru olduğunu bilmiyorum.

+0

evet ,, çalıştığını, sadece model görünümü mimarisinin avantajlarından almaz. Tek boyut modelini tablonun iki boyutuna dönüştürmek için QAbstractProxyModel kullanabileceği bir iş parçacığı vardı, ancak elimde çözüm yok, derleme yapmadan – Swift

cevap

2

QComboBox, yalnızca bir sütunu gösterdiğinden, setModelColumn()'u kullanmalısınız. Böyle

:

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

numaraya bağlanıyor. [cb] bir şey değil. Ayrıca, bir açılan kutu içinde indeks hala bir tablo satırı – Swift

+0

dizesi olacak farkında olmalı! setModelColumn() çalışır, ancak kodunuz derlenmiyor. Ana soruda örnek (Edit) yazdım. –

1

emin değil oradaki döngü içinde sebeple ancak bu şekilde eğer daha okunabilir ve muhtemelen hatasız: o değişir eğer

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

, kolon sayısı ile sihirli sayı 2 değiştirin.

Sanırım, ComboBox öğe yerine tablo satırını kullanır ve araştırma gerektiren ilk öğeyi görüntüler. Index0 veya index1'i seçerseniz ne yapar?

DÜZENLEME: evet, neler oluyor. Ne kadar sütun var olursa olsun, açılan kutu tablodan satırı (kayıt numarası) alır. QTableView için özel bir temsilci oluşturmanız gerektiğini ve Evet, Model Sütunu'nu değiştirmen gerektiğini düşünüyorum. Alternatif, tek sütun modeliyle QTableView analoğunu oluşturmaktır

İlgili konular