2017-07-19 4 views
1

Wie wird die Zeilennummer des Widgets in einer Zelle von Qtablewidget angezeigt, wenn es angeklickt wird?

Was ich versuche, ist, die Zeilennummer von QcomboBox zu erhalten, wenn Benutzer Elemente auswählt. Obwohl es einfach ist, die Zelle Spalte und Zeile mit dem Signal zu erhalten, aber es funktioniert nur, wenn es kein Widget auf der Zelle gibt.

so, wie die Zeilennummer im Fall erhalten, wenn ein Widget in einer Zelle platziert ist.

Hinweis: der Combobox werden alle dynamisch hinzugefügt

Antwort

1

At-Endlich fand ich 2 Möglichkeiten, es zu tun.

  1. Durch die Eigenschaft der QComboBox Einstellung
  2. Mit dem QSignalMapper

Erste Methode

QComboBox* mCombo = new QCombobox(); 
mComboBox->setProperty("row",(int) i); // i represents the row number in qtablewidget 

In Handler-Funktion, wo Sie die geklickt QComboBox sind Handling

int row = sender()->property("row").toInt(); 

Zweite Methode

QSignalMapper *signalMapper= new QSignalMapper(this); //Create a signal mapper instance 

for (each row in table) { 
    QComboBox* mCombo = new QComboBox(); 
    table->setCellWidget(row,col,combo);       
    connect(mCombo, SIGNAL(currentIndexChanged(int)), signalMapper, SLOT(map())); 

/*connect each signal of QComboBox to signal Mapper slot (i.e map()) which in turns connected to the signal of signalMapper calling the SLOT associated with it (i.e rowFinder) */   

signalMapper->setMapping(combo, (int)row); //assign mapping to each widgetusing set mapping 


} 

connect(signalMapper, SIGNAL(mapped(int)), 
     this, SLOT(rowFinder(int))); 

Funktion: rowFinder (int rowIndex)

int row = rowIndex; //here is the row indexof selected QComboBox 
+0

Der richtige Weg ist eine QStyledItemDelegate Unterklasse zu verwenden, die die Combobox malt und schafft es als Redakteur. Sobald das implementiert ist, können Sie die Signale von 'table-> selectionModel()' ('selectionChanged' und' currentChanged') verwenden, um alles abzufangen, was Sie wollen (aber auch hier bin ich zu 99,9999% sicher, was Sie zu tun versuchen) bereits innerhalb des Delegierten machbar) – IlBeldus

Verwandte Themen