Anzeige:
Ergebnis 1 bis 8 von 8

Thema: QTable::columnAt(QCursor::pos().x())

  1. #1
    Registrierter Benutzer Avatar von Gartenzwerg
    Registriert seit
    26.06.2003
    Beiträge
    75

    QTable::columnAt(QCursor::pos().x())

    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
    http://sebastian.familiegibb.de | GiKraSoft | Nachwachsende Rohstoffe
    Ich denke niemals an die Zukunft - sie kommt früh genug.
    Albert Einstein

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer Avatar von Gartenzwerg
    Registriert seit
    26.06.2003
    Beiträge
    75
    Hi,
    wie meinst du, soll ich auf die MouseEvents reagieren?
    Code:
    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
    Geändert von Gartenzwerg (13-05-2004 um 13:34 Uhr)
    http://sebastian.familiegibb.de | GiKraSoft | Nachwachsende Rohstoffe
    Ich denke niemals an die Zukunft - sie kommt früh genug.
    Albert Einstein

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ah, ich dachte du reagierst auf ein Mouse Event.

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

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer Avatar von Gartenzwerg
    Registriert seit
    26.06.2003
    Beiträge
    75
    hi,
    habe das nun wie folgt umgestellt:
    Code:
    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.
    Code:
    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
    http://sebastian.familiegibb.de | GiKraSoft | Nachwachsende Rohstoffe
    Ich denke niemals an die Zukunft - sie kommt früh genug.
    Albert Einstein

  6. #6
    Registrierter Benutzer Avatar von Gartenzwerg
    Registriert seit
    26.06.2003
    Beiträge
    75

    Lightbulb

    Hi,
    ich habe es jetzt wie folgt behoben:
    Code:
    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
    http://sebastian.familiegibb.de | GiKraSoft | Nachwachsende Rohstoffe
    Ich denke niemals an die Zukunft - sie kommt früh genug.
    Albert Einstein

  7. #7
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    IMHO macht es den Code lesbarer, wenn du den Cast nur einmal machst, also eine lokale Variable vom Typ QContextMenuEvent benutzt.

    Code:
                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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  8. #8
    Registrierter Benutzer Avatar von Gartenzwerg
    Registriert seit
    26.06.2003
    Beiträge
    75
    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
    http://sebastian.familiegibb.de | GiKraSoft | Nachwachsende Rohstoffe
    Ich denke niemals an die Zukunft - sie kommt früh genug.
    Albert Einstein

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •