Seite 1 von 1

QTableWidget auffrischen

Verfasst: 18. Dezember 2006 21:24
von katz0r
Hallo allerseits,

ich will folgenden Slot verwenden um die Werte die in einer QTableWidget zu ändern. Wenn in der entsprechenden Zelle schon ein QTableWidgetItem ist soll der Text geändert werden ansonsten will ich ein neues Item erstellen.

Vorher nehm ich noch die Verbindung Zwischen dem cellChanged-Signal und meinem Daten-Manager weg.
Der Slot wird aufgerufen wenn der Benutzer ein Tab öffnet in dem das TableWidget drin ist.
Ein erstes mal wird es aufgerufen solange noch ein anders Tab offen ist. Da funktioniert es.
Und so lange ich die DAten nicht ändere, kann ich es auch noch öfter aufrufen. Sobald jedoch die Daten, die angezeigt werden sollen irgendwie geändert werden stürzt das Programm in dieser Prozedur mit segfault ab.

Code: Alles auswählen

void mainWindow::retable(int index)
{
	if (index == 0) 
	{
	QObject::disconnect(daten, SLOT(changeValue(int, int)));
	std::cout << "refreshing table view" << tableWidget->rowCount() << " " << tableWidget->columnCount() << std::endl;
	

	tableWidget->setColumnCount ( daten->data.size()*2 );
	tableWidget->setRowCount ( daten->data.begin()->second.x.size() );
	//tableWidget->clear();
	QStringList headers;
	
	int k(0);
	for (DMAN_MAP_TYPE::iterator i = daten->data.begin(); i != daten->data.end(); i++)
	{

		int j;
		for (j=0; j < i->second.x.size(); j++)
		{
			std::cout << j << " " << k << std::endl;
			if (tableWidget->item(j, k*2)) 
			{ 
				std::cout << "is schon da" << std::endl;
				tableWidget->item(j, k*2)->setText(locale->toString(i->second.x[j]));}
			else
			{
				std::cout << "is nich da" << std::endl;
				QTableWidgetItem *item = new QTableWidgetItem(locale->toString(i->second.x[j]));
				tableWidget->setItem(j, k*2, item);
			}
			if (tableWidget->item(j,k*2+1)) tableWidget->item(j, k*2+1)->setText(locale->toString(i->second.y[j]));
			else
			{				
				QTableWidgetItem *item2 = new QTableWidgetItem(locale->toString(i->second.y[j]));
				tableWidget->setItem(j, k*2+1, item2);
			}
		}

		headers.append(i->first);
		headers.append(i->first);
		++k;
	}
	tableWidget->setHorizontalHeaderLabels ( headers );
	}
	QObject::connect(tableWidget, SIGNAL(cellChanged(int,int)), daten, SLOT(changeValue(int, int)));
}
Hat jemand ideen? Vielen Dank und eine schöne rest-Adventszeit, Martin

frohLocken zur Weihnachtszeit : DeadLock

Verfasst: 19. Dezember 2006 18:14
von katz0r
ahja, habs selber gefunden... dasProblem war, dass eine andre Funktion auch auf die Daten zugreifen wollte oder auf die Tabs, was auch immer, jedenfalls haben sie sich nicht vertrage, die andere Funktion soll die Grafische Darstellung der Daten auffrischen

jetzt hab ich die beiden in MutexLocks gepackt, so dass sie jeweils warten müssen bis die andere fertig ist. Das Problem ist jetz nur, dass ich Deadlocks Kriege, aber wie kann das sein? Der Thread der die Mutex gelockt hat müsste doch weiterlaufen und dann irgendwann die Mutex wieder freigeben, so dass der andere ran darf... oder? die beiden relevanten Funktionen :


Code: Alles auswählen

void mainWindow::retable(int index)
{
	if (index == 0)
	{
        refreshmutex.lock();

//das gleiche wie im ersten Post

	QObject::connect(tableWidget, SIGNAL(cellChanged(int,int)), daten, SLOT(changeValue(int, int)));

	refreshmutex.unlock();
	}
		
}
	
void mainWindow::replot()
{
	refreshmutex.lock();
	
	std::cout << "refreshing plot view..." << std::flush;
	while (plots.size()>0)
	{
		QWidget *plot = plots.back();
		plots.pop_back();
		tabWidget->removeTab(tabWidget->indexOf(plot));
		delete plot;
	}
	std::cout << "..." << std::flush;
	for (DMAN_MAP_TYPE::iterator i = daten->data.begin(); i != daten->data.end(); i++)
	{	
		if (i->second.x.size() > 1)
		{
		std::cout << "newPlot " << std::flush;
		QwtPlot *plot = new QwtPlot;
		
		if (plot) {std::cout << i->second.crv << " " << plot << " " << qPrintable(i->first) << std::flush;
		i->second.crv->attach(plot); }
		plots.push_back(plot);
		tabWidget->addTab((QWidget*)plot, i->first);
		}
	}
	std::cout << "done." << std::endl;
	refreshmutex.unlock();
	
}
weiss jemand wieso da ein thread stehenbleiben könnte? vielen Dank, Martin

Verfasst: 19. Dezember 2006 21:06
von katz0r
achw as solls, qt is ja schnell. Ich hab einfach n neues QTableWidget angelegt jedesmal wenn die Daten erneuert werden,d auert auch nich so lange für 10000 Messwerte, merkt also keiner^^

ein hoch auf die russische Methode