2009-10-17 25 views
7

Me gustaría ejecutar un objeto QMenu en la posición del cursor de texto en un QPlainTextEdit. Mi problema es que QTextCursor solo se define por su posición en el Texto (índice del personaje).¿Cómo encontrar la posición global del cursor de texto?

¿Cómo puedo encontrar la posición global del QTextCursor? ¿Debo utilizar otro objeto que no sea QTextCursor para encontrar la posición del cursor de texto donde quiero abrir mi QMenu?

Gracias por adelantado.

Respuesta

8

Nunca me he probado, pero ¿no funciona QPlainTextEdit::cursorRect()? Debería darle la posición del cursor en las coordenadas de la vista. Luego puede obtener la ventana gráfica usando viewport() y asignar la posición local a global usando viewport()->mapToGlobal().

+0

cursorRect retorno a la posición relativa del cursor en la QPlainTextEdit mientras que necesito posición global, tal como existe para QCursor. –

+1

Bueno, esperaba que supieras sobre 'editor-> viewport() -> mapToGlobal()' :) –

+0

No sabía esto. Funciona bien. Gracias –

0

he encontrado consulta similar a la de algún foro en línea y aquí hay alguien sugirió la salida como

Nota: Referencia de http://www.unix.com/unix-linux-applications/81388-read-position-mouse-cursor.html, Autor de publicación de abajo es daggilli, usuario registrado de foros en línea UNIX. El crédito de la publicación a continuación en su forma completa corresponde a daggilli.

Este es el código completo para una aplicación Qt que armé en unos diez minutos (llamada retícula) que muestra las coordenadas actuales del mouse en una ventana. Es posible que puedas extraer lo suficiente para ser útil. Esto es Qt 3.1, pero Qt 4 no es muy diferente. Necesitarás las bibliotecas de desarrollo Qt, no solo los tiempos de ejecución. El código comprende dos archivos, crosshair.hy crosshair.cpp.

crosshair.h:

Código:

#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:

Código:

#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())); 
} 

para construir este, poner los dos archivos en un directorio llamado punto de mira . cd a ese directorio y escriba Código:

qmake -project 
qmake 
make 

Esto no hace nada más complejo que heredar de una QLabel, establecer un temporizador para ejecutar 20x un segundo, agarra el cursor actual coordina y escribirlos en el texto de la etiqueta. Al hacer clic en la ventana, se cierra. Lo uso para arreglar errores de alineación en JavaScript cuando estoy diseñando objetos.

Puede abrir un archivo en el constructor de la clase Crosshair para almacenar sus datos y usar gettimeofday (2) para obtener una marca de tiempo. Nada dice que Qt tiene que ejecutarse en modo GUI (puede decirlo explícitamente que no en el constructor QApplication).

Qt de Trolltech: http://doc.trolltech.com

+0

Sé cómo rastrear la posición del cursor del mouse. Necesito seguir la posición del cursor de texto. Gracias por tu ayuda de todos modos –

Cuestiones relacionadas