2009-10-17 20 views
7

Chciałbym wykonać obiekt QMenu na pozycji kursora tekstu w QPlainTextEdit. Mój problem polega na tym, że QTextCursor definiuje się tylko przez jego pozycję w tekście (indeks znaku).Jak znaleźć globalną pozycję kursora tekstowego?

Jak mogę znaleźć pozycję globalną QTextCursor? Czy powinienem użyć innego obiektu niż QTextCursor, aby znaleźć pozycję kursora tekstowego w miejscu, w którym chcę otworzyć moją QMenu?

Dziękuję z góry.

Odpowiedz

8

Nigdy nie próbowałem siebie, ale czy nie działa QPlainTextEdit::cursorRect()? Powinien podać pozycję kursora we współrzędnych rzutni. Następnie można uzyskać rzutnię przy użyciu viewport() i mapować lokalną pozycję na globalną przy użyciu viewport()->mapToGlobal().

+0

cursorRect powrotu względnego położenia kursora w QPlainTextEdit natomiast trzeba globalną pozycję, ponieważ istnieje QCursor. –

+1

Cóż, spodziewałem się, że wiesz o 'editor-> viewport() -> mapToGlobal()' :) –

+0

Nie wiedziałem tego. To działa dobrze. Dzięki –

0

znalazłem podobny do Twojego zapytania w pewnym forum internetowym a tu ktoś zaproponował wyjście jako

Uwaga: Reference z http://www.unix.com/unix-linux-applications/81388-read-position-mouse-cursor.html, autor poniżej wpis jest daggilli zarejestrowanym użytkownikiem UNIX forach internetowych. Zaliczenie poniższej publikacji w pełnej formie przechodzi na daggilli.

To jest kompletny kod dla aplikacji Qt, którą zrzuciłem w ciągu około dziesięciu minut (zwanej krzyżykiem), która wyświetla bieżące współrzędne myszy w oknie. Możesz być w stanie wyciągnąć z tego wystarczająco dużo, aby było użyteczne. To jest Qt 3.1, ale Qt 4 nie jest wielką różnicą. Będziesz potrzebował bibliotek rozwojowych Qt, a nie tylko środowiska wykonawczego. Kod składa się z dwóch plików: crosshair.h i crosshair.cpp.

crosshair.h:

Kod:

#ifndef CROSSHAIR_H 
#define CROSSHAIR_H 
#include <qwidget.h> 
#include <qstring.h> 
#include <qlabel.h> 
#include <qevent.h> 

class Crosshair : public QLabel 
{ 
Q_OBJECT 

public: 
    Crosshair(QWidget *parent=0); 

protected: 
    void mousePressEvent(QMouseEvent *); 

private: 
    QTimer   *timer; 

private slots: 
    void timerfire(); 
}; 

#endif 

crosshair.cpp:

Kod:

#include <qapplication.h> 
#include <qpushbutton.h> 
#include <qtimer.h> 
#include <qcursor.h> 
#include <iostream> 
#include "crosshair.h" 

using namespace std; 

int main(int argc,char **argv) 
{ 
    QApplication a(argc,argv); 

    Crosshair mousepos; 

    a.setMainWidget(&mousepos); 
    mousepos.show(); 
    return a.exec(); 
} 

Crosshair::Crosshair(QWidget *parent) : QLabel(parent) 
{ 
    setIndent(20); 
    resize(100,30); 
    move(1200,200); 
    setText("0,0"); 
    timer=new QTimer(this); 
    connect(timer,SIGNAL(timeout()),this,SLOT(timerfire())); 
    timer->start(50,false); 
} 

void Crosshair::mousePressEvent(QMouseEvent *) 
{ 
    qApp->quit(); 
} 

void Crosshair::timerfire() 
{ 
    QPoint p=QCursor::pos(); 
    this->setText(QString().sprintf("%d,%d",p.x(),p.y())); 
} 

Aby to budować, umieścić oba pliki w katalogu o nazwie krzyżyk . cd do tego katalogu i wpisz Kod:

qmake -project 
qmake 
make 

ten nie robi nic bardziej złożonego niż dziedziczą z QLabel, ustawić timer do uruchomienia 20x sekundę, chwyć bieżący współrzędne kursora i zapisać je do tekstu etykiety. Kliknięcie w oknie zamyka je. Używam go do naprawiania błędów wyrównania w JavaScript podczas układania obiektów.

Można otworzyć plik w konstruktorze klasy Crosshair, aby przechowywać dane, i użyć gettimeofday (2), aby uzyskać znacznik czasu. Nic nie mówi, że Qt musi działać w trybie GUI (można wyraźnie powiedzieć, że nie ma go w konstruktorze QApplication).

Qt z Trolltechu: http://doc.trolltech.com

+0

Wiem, jak śledzić pozycję kursora myszy. Muszę śledzić pozycję kursora tekstu. Mimo wszystko, dziękuję za twoją pomoc –

Powiązane problemy