[Qt 4.1.4] QTWin QTX11 Unterschiede Paint Probleme

Alles rund um die Programmierung mit Qt
Antworten
chronos
Beiträge: 34
Registriert: 20. September 2005 09:17
Kontaktdaten:

[Qt 4.1.4] QTWin QTX11 Unterschiede Paint Probleme

Beitrag von chronos »

Hallo an alle,

ich bin gerade dabei ein so etwas ähnliches wie ein Organizer Widget zu implementieren ( bekannt aus M$ Outlook oder KDE Kalender termine können mit der maus verschoben werden)

Unter Windows funktioniert das ganze super das verschieben der Widgets läuft einfach glatt ab und es sieht auch gut aus (keine paint fehler kein flackern)

Leider ist das unter Linux nicht so. Beim verschieben der Termine bekomme ich massig PaintFehler. Wie zB:
Wenn die Termine transparent sind (in QColor Alpha Wert auf 127) sieht es beim verschieben eines Termins so aus als ob die darunterliegenden Termine mit verschoben werden, sie springen aber kurz darauf wieder zurück. Also wahrscheinlich stimmt was mit dem Repaint Event nicht.

Okay da kann ich einfach die Transparenz unter Linux ausschalten aber leider werden dann die Termine die zeitweise vom gerade zu verschiebendenTermin kurzzeitig verdeckt werden erst mit verzögerung neu gezeichnet, dH an der Stelle bleibt kurzzeitig ein weisser Fleck zurück.

Zur Implementation:
Die einzelnen Termine sind alles eigenständige Widgets deren bewegungen von meiner eigenen moveItem Funktion (ausgelöst durch ein MouseMoveEvent und mit einem EventFilter abgefangen) durchgeführt werden.
Die Funktion verwendet dabei die Methoden :
setGeometry
resize
oder move.

Hat jemand eine Idee wie ich diese hässlichen Effekte unterbinden kann? Is das ein QtBug oder vielleicht unter X11 nicht anders machbar?

mfg benjamin
chronos
Beiträge: 34
Registriert: 20. September 2005 09:17
Kontaktdaten:

Beitrag von chronos »

Hm keiner eine Idee?
Hier ist ein Codeausschnitt das das Movement der einzelnen Widgets handelt:

Code: Alles auswählen

void OrganizerWidget::moveItem( IncidenceItem * item, QPoint relative )
{
	int newCol,newRow;	
	int iMoveTimeUnits;

	if(relative.x() == 0 && relative.y() == 0)
		return;

	if(item->isSplitItem())
		return moveSplitItem(item,relative);
	
	int newStartTime = posToTimeUnit(QPoint(item->x()+relative.x(),item->y()+relative.y()));
	int newEndTime = newStartTime + item->duration() -1;
	if(newStartTime < 0)
		return;
	if(newEndTime > iNumCols*iNumRows)
		return;
	QPoint newPos = TimeUnitToPos(newStartTime);
	QPoint newEnd = TimeUnitToPos(newStartTime+item->duration()-1);
	QPoint startGrid = posToGrid(newPos);
	QPoint endGrid = posToGrid(newEnd);
	
	if(startGrid.x() != endGrid.x())
		return showItemAt(item,newStartTime);

	else
	{
                /*hier der eigentliche code der das widget verschiebt*/
            /*hier wird direkt QWidget::move(QPoint) verwendet*/ 
		item->move(newPos);
		if(relative.x() < 0)
			this->actionInfo->direction = LEFT;
		else
			this->actionInfo->direction = RIGHT;
		ensureItemVisible(item);
		if(relative.y() < 0)
			this->actionInfo->direction = UP;
		else
			this->actionInfo->direction = DOWN;
		ensureItemVisible(item);
	}
	item->setStartAtTimeUnit(newStartTime);
	return;
}
Normalerweise sollte das DoubleBuffering diese Effekte unterbinden oder? Oder muss ich bei QTX11 das Double Buffering erst irgendwie aktivieren?
Antworten