PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QTable::columnAt(QCursor::pos().x())



Gartenzwerg
13-05-2004, 06:35
Hi,
ich habe eine QTable innerhalb eines QMainWindows. Nun möchte ich wissen, welche Spalte unter dem Mauszeiger ist. Darum verwende ich in einem eventFilter diese Funktion:
QTable::columnAt(QCursor::pos().x()) Doch leider ist die Positionsangabe für die Funktion columnAt() relativ anzugeben und die QCursor::pos() scheint global zu sein, d.h. die Koordinaten von QCursor: pos() liegen immer ungefähr 30 Pixel zu weit rechts, was mir das Ergebnis verfälscht. Wie kann ich vorgehen um trotzdem an die richtige Spalte zu kommen?

Tschau Gartenzwerg

anda_skoa
13-05-2004, 09:49
Jedes Widget hat eine Methode mapFromGlobal, die globale Koordinaten auf die des Widgets umrechnet.

Aber vielleicht reagierst du in deinem Eventfilter besser auf die MouseEvents des Widgets, die haben bereits die richtigen Kooridnaten.

Oder QTable ableiten und contentsMouseMoveEvent reimplementieren.

Ciao,
_

Gartenzwerg
13-05-2004, 13:31
Hi,
wie meinst du, soll ich auf die MouseEvents reagieren?


bool CategoryTable::eventFilter(QObject *watched, QEvent *event)
{
if(watched == horizontalHeader())
{
switch(event->type())
{
case QEvent::ContextMenu:
if((columnPos(numCols()-1)+columnWidth(numCols()-1))>=(QCursor::pos().x()))
{
setCurrentCell(currentRow(), columnAt(QCursor::pos().x()));
mHeaderPopupMenu->popup(QCursor::pos());
}
break;
default: break;
}
}
return QTable::eventFilter(watched, event);
}

Wie sollte ich da noch auf die MouseEvents reagieren?

Tschau Gartenzwerg

anda_skoa
13-05-2004, 21:19
Ah, ich dachte du reagierst auf ein Mouse Event.

QPoint pos = mapFromGlobal(QCursor::pos());

Ciao,
_

Gartenzwerg
14-05-2004, 13:16
hi,
habe das nun wie folgt umgestellt:


bool CategoryTable::eventFilter(QObject *watched, QEvent *event)
{
if(watched == horizontalHeader())
{
switch(event->type())
{
case Event::ContextMenu:
if((columnPos(numCols()-1)+columnWidth(numCols()-1))>=mapFromGlobal(QCursor::pos()).x())
{
setCurrentCell(currentRow(), columnAt(mapFromGlobal(QCursor::pos()).x()));
mHeaderPopupMenu->popup(QCursor::pos());
}
break;
default: break;
}
}
return QTable::eventFilter(watched, event);
}

Der folgende Code gibt, wenn ich auf das rechte Ende der letzten Spalte klicke, 400, 100, 531, 527 aus.


QString tmp="";
tmp.sprintf("%d, %d, %d, %d", columnPos(numCols()-1),columnWidth(numCols()-1),(QCursor::pos().x()), mapFromGlobal(QCursor::pos()).x());
qDebug(tmp); // gibt: 400, 100, 531, 527

Die mapFromGlobal-Koordinate unterscheidet sich im X-Wert nur um 4 Pixel und es fehlen immer noch 27 bis zur richtigen Erkennung.
Woran liegt das?

Tschau Gartenzwerg

Gartenzwerg
16-05-2004, 09:28
Hi,
ich habe es jetzt wie folgt behoben:


bool CategoryTable::eventFilter(QObject *watched, QEvent *event)
{
if(watched == horizontalHeader())
{
switch(event->type())
{
case QEvent::ContextMenu:
if((columnPos(numCols()-1)+columnWidth(numCols()-1))>=static_cast<QContextMenuEvent*>(event)->x())
{
setCurrentCell(currentRow(), columnAt(static_cast<QContextMenuEvent*>(event)->x()));
mHeaderPopupMenu->popup(static_cast<QContextMenuEvent*>(event)->globalPos());
}
break;
default: break;
}
}
return QTable::eventFilter(watched, event);
}

Tja, wer lesen kann ist klar im Vorteil, nachdem ich ewig lange in der Qt-Dokumentation gesucht habe, fand ich, dass auch das QContextMenuEvent die Koordinaten relativ verarbeitet.

Tschau Gartenzwerg

anda_skoa
16-05-2004, 19:04
IMHO macht es den Code lesbarer, wenn du den Cast nur einmal machst, also eine lokale Variable vom Typ QContextMenuEvent benutzt.



case QEvent::ContextMenu:
{
QContextMenuEvent* contextMenuEvent = static_cast<QContexMenuEvent*>(event);
if((columnPos(numCols()-1)+columnWidth(numCols()-1))>=contextMenuEvent->x())
{
setCurrentCell(currentRow(), columnAt(contextMenuEvent->x()));
mHeaderPopupMenu->popup(contextMenuEvent->globalPos());
}
}
break;


Ciao,
_

Gartenzwerg
16-05-2004, 21:28
hi,
das ist Ansichtssache, aber du hast recht, das es nicht so fehleranfällig ist und deshalb auch lesbarer. Ich habe es umgestellt.

Tschau Gartenzwerg