2009-08-26 16 views
14

Jedna komórka w każdym rzędzie QTableWidget zawiera comboboxWybór QComboBox w QTableWidget

for (each row in table ...) { 
    QComboBox* combo = new QComboBox();  
    table->setCellWidget(row,col,combo);    
    combo->setCurrentIndex(node.type());     
    connect(combo, SIGNAL(currentIndexChanged(int)),this, SLOT(changed(int))); 
    .... 
} 

w obsługi funkcji :: zmienił (int index) Mam

QComboBox* combo=(QComboBox*)table->cellWidget(_row,_col); 
combo->currentIndex() 

Aby odzyskać kopię combobox i uzyskać nowy wybór.
Ale nie mogę uzyskać wiersza/kolumny.
Żaden z sygnałów tableXXXX nie jest emitowany po wybraniu lub zmianie elementu osadzonego, a currentRow()/currentColumn() nie są ustawione.

Odpowiedz

2

Myślę, że chcesz rzucić okiem na QSignalMapper. Brzmi to jak typowy przypadek użycia dla tej klasy, tj. Masz kolekcję obiektów, w których podłączasz się do tego samego sygnału na każdym z nich, ale chcesz wiedzieć, który obiekt emitował sygnał.

6

Rozszerzając Trubadur na answer:

Oto modyfikacja dokumentacji QSignalMapper aby pasowały do ​​sytuacji:

QSignalMapper* signalMapper = new QSignalMapper(this); 

for (each row in table) { 
    QComboBox* combo = new QComboBox(); 
    table->setCellWidget(row,col,combo);       
    combo->setCurrentIndex(node.type()); 
    connect(combo, SIGNAL(currentIndexChanged(int)), signalMapper, SLOT(map())); 
    signalMapper->setMapping(combo, QString("%1-%2").arg(row).arg(col)); 
} 

connect(signalMapper, SIGNAL(mapped(const QString &)), 
     this, SLOT(changed(const QString &))); 

W funkcji obsługi :: zmienił (pozycja QString):

QStringList coordinates = position.split("-"); 
int row = coordinates[0].toInt(); 
int col = coordinates[1].toInt(); 
QComboBox* combo=(QComboBox*)table->cellWidget(row, col); 
combo->currentIndex() 

Należy zauważyć, że QString jest dość niezdarnym sposobem przekazywania tych informacji. Lepszym wyborem będzie nowy QModelIndex, który mijamy, a który zmieniona funkcja będzie następnie usuwać.

Wadą tego rozwiązania jest to, że tracisz wartość emitowaną przez currentIndexChanged, ale możesz zapytać QComboBox o indeks z :: changed.

+1

connect (signalMapper, SIGNAL (odwzorowany (const QString &)), to szczelina (zmianie (const QString &))); –

+0

@ J.Chomel Apologies, nie widzę, jak twój komentarz różni się od ostatniej linii mojego pierwszego bloku kodu. Czy możesz rozwinąć? – Bill

-1

Po prostu mam ten sam problem i tak rozwiązałem. Używam QPoint, który jest czystszym sposobem na zapisanie wartości X-Y niż QString. Mam nadzieję że to pomoże.

classConstructor() { 
    //some cool stuffs here 
    tableVariationItemsSignalMapper = new QSignalMapper(this); 
} 

void ToolboxFrameClient::myRowAdder(QString price) { 
    QLineEdit *lePrice; 
    int index; 
    // 
    index = ui->table->rowCount(); 
    ui->table->insertRow(index); 
    // 
    lePrice = new QLineEdit(price); 
    connect(lePrice, SIGNAL(editingFinished()), tableVariationItemsSignalMapper, SLOT(map())); 
    tableVariationItemsSignalMapper->setMapping(lePrice, (QObject*)(new QPoint(0, index))); 
    // final connector to various functions able to catch map 
    connect(tableVariationItemsSignalMapper, SIGNAL(mapped(QObject*)), 
      this, SLOT(on_tableVariationCellChanged(QObject*))); 
} 

void ToolboxFrameClient::on_tableVariationCellChanged(QObject* coords) { 
    QPoint *cellPosition; 
    // 
    cellPosition = (QPoint*)coords; 
} 
+0

Myślę, że masz wyciek pamięci z obiektami QPoint, dlaczego używasz nowych? Naprawdę potrzebuję narzędzi, które QPoint zapewnia w tym przypadku, więc nie korzystam z nich zbytnio, – ymoreau

+0

@ymoreau dziękuję za wskazanie tego. Minęło dużo czasu od mojej odpowiedzi i nie mogę odpowiedzieć na twoje pytanie. ay. –

7

Nie potrzeba odwzorowującego sygnału ... Gdy combobox jest tworzony można po prostu dodać dwie właściwości niestandardowych do niego:

combo->setProperty("row", (int) nRow); 
combo->setProperty("col", (int) nCol); 

w funkcji modułu obsługi można uzyskać wskaźnik z powrotem do nadawca sygnału (twój combobox).

Teraz prosząc o właściwościach możesz mieć swój wiersz/COL powrotem:

int nRow = sender()->property("row").toInt(); 
int nCol = sender()->property("col").toInt(); 
Powiązane problemy