Seite 1 von 1

QTableWidget gezielt durchsuchen

Verfasst: 24. November 2009 10:37
von The_EcKo
Ich mal wieder :wink:

Dieses mal geht es darum, dass ich ein QTableWidget habe in das ich über einen QDialog Items eintrage.
Die Sache ist die, es gibt Keys und zu jedem Key 2 Modes.
Key pressed und Key released.
Wenn ich also einen Key eintrage hab ich im QTableWidget steht
Name Mode
F1 Pressed

usw.
Dazwischen habe ich jetzt ein Abfrage die verhindern soll, dass ein Key mit demselben Mode kommt. Es soll also nciht möglich sein 2 mal F1 Pressed da stehen zu haben.

Hier mal der Quellcode der Funktion

Code: Alles auswählen

void KeyCreate::createNewItemKey(const QString& name)
{
	qDebug() << "Programmstatus: In KeyCreate::CreateNewItemKey";
	QString tmpName;
	QString tmpMode;

	if(name.size()==0)
	{
		emit setModified(1);
		tmpName = newDialog->getName();
		tmpMode = newDialog->getMode();
	}
	else
		tmpName = name;

	if(keyCount >= MAXKEYS)  //too many keys
	{
		QMessageBox::critical(this, tr("Error"), tr("Maximum number of keys reaches."));
		return;
	}

	if((keyTable->findItems(tmpName, Qt::MatchExactly)).size()!=0 && keyTable->findItems(tmpMode, Qt::MatchExactly).size()!=0)
	{
		qDebug() << "createNewKeyItem:: found 2 exact modes";
		QMessageBox::critical(this, tr("Error"), tr("Mode already exists for this key, please choose another mode."));
		newDialog->show();
		return;
	}

	if((keyTable->findItems(tmpName, Qt::MatchExactly)).size()!=0 && keyTable->findItems(tmpName, Qt::MatchExactly).size()!=0)
	{
		qDebug() << "createNewKeyItem:: found 2 exact names";
		newDialog->deleteFromNameList(tmpName);
		editDialog->deleteFromNameList(tmpName);
	}

	tableItems[0][keyCount] = new QTableWidgetItem(tmpName);
	tableItems[1][keyCount] = new QTableWidgetItem(tmpMode);

	QString keyName = tableItems[0][keyCount]->text();
	QString keyMode = tableItems[1][keyCount]->text();
	qDebug() << keyName;  qDebug() << keyMode;

	if(keyTable->rowCount()==0)  //keyTable is empty
	{
		keyTable->insertRow(0);

		for(uint8_t i=0; i<KEYCOLUMNS; i++)
			keyTable->setItem(0, i, tableItems[i][keyCount]);

		newDialog->clearAll();
		emit keyCreated(tmpName);
		keyCount++;
		return;
	}
	else  //keyTable is not empty
	{
		keyTable->insertRow(keyTable->rowCount());

		for(uint8_t i=0; i<KEYCOLUMNS; i++)
			keyTable->setItem(keyTable->rowCount()-1, i, tableItems[i][keyCount]);

		newDialog->clearAll();
		emit keyCreated(tmpName);
		keyCount++;
		return;
	}
}
Wie man sieht sucht die Abfrage mit findItems in keyTable(QTableWidget) nach Namen und Mode des gerade erstellten Keys und gibt gegebenfalls eien Meldung aus.

Problem ist jetzt nur ich habe
F1 Pressed, F1 Released, F2 Pressed in der LIste und möchte nun F2 Released hinzufügen, dann kann ich das nciht mehr weil er im QTableWidget ja irgendwo F2 und irgendwo anders Released gefunden hat.
Ich möchte aber das er immer nur von einer Zeile die beiden Spalten überprüft. Geht das irgendwie bzw. war meine Frage verständlich^^

Verfasst: 24. November 2009 11:59
von upsala
Da die Tabelle recht klein sein wird, würde ich die Tabelle in einer Schleife selbst durchlaufen und die Spalten mit data() auslesen und vergleichen...

Verfasst: 24. November 2009 12:44
von AuE
oder intern die Daten in einer Map halten und die Map dann in die Tabelle. Die Map kannst du kostengünstiger durchsuchen!

Verfasst: 24. November 2009 12:46
von RHBaum
ja, bei sowas sollt man lieber nen QTableView und nen eigenes QItemModel verwenden. Kann man die daten intern so halten, wie es die funktionalitaet verlangt.

Ciao ...

Verfasst: 24. November 2009 12:54
von The_EcKo
upsala hat geschrieben:Da die Tabelle recht klein sein wird, würde ich die Tabelle in einer Schleife selbst durchlaufen und die Spalten mit data() auslesen und vergleichen...
Hm naja was heisst klein, es sind 24 Tasten mit je 2 Funktionen dann
AuE hat geschrieben:oder intern die Daten in einer Map halten und die Map dann in die Tabelle. Die Map kannst du kostengünstiger durchsuchen!
Danke das werd ich mal probieren =)
RHBaum hat geschrieben:ja, bei sowas sollt man lieber nen QTableView und nen eigenes QItemModel verwenden. Kann man die daten intern so halten, wie es die funktionalitaet verlangt.
Mh joa hab das Ganze ja von einem Vorgänger übernommen und weiß net ob ich jetzt das Ganze Widget austauschen soll, da das meiste ja funktioniert^^