2009-10-17 60 views
7

Tôi muốn thực thi đối tượng QMenu tại vị trí của con trỏ văn bản trong một QPlainTextEdit. Vấn đề của tôi là QTextCursor chỉ được xác định bởi vị trí của nó trong Văn bản (chỉ mục của ký tự).Cách tìm vị trí toàn cục của con trỏ văn bản?

Làm cách nào để tìm vị trí toàn cầu của QTextCursor? Tôi có nên sử dụng một đối tượng khác ngoài QTextCursor để tìm vị trí của con trỏ văn bản mà tôi muốn mở QMenu không?

Cảm ơn bạn trước.

Trả lời

8

Tôi chưa bao giờ thử bản thân mình, nhưng không làm việc QPlainTextEdit::cursorRect()? Nó sẽ cho bạn vị trí của con trỏ trong tọa độ khung nhìn. Sau đó, bạn có thể nhận được chế độ xem bằng cách sử dụng viewport() và ánh xạ vị trí cục bộ sang vị trí cục bộ bằng cách sử dụng viewport()->mapToGlobal().

+0

cursorRect trở lại vị trí tương đối của con trỏ vào QPlainTextEdit trong khi tôi cần vị trí toàn cầu vì nó tồn tại cho QCursor. –

+1

Vâng, tôi hy vọng bạn biết về 'editor-> viewport() -> mapToGlobal()' :) –

+0

Tôi không biết điều này. Nó hoạt động tốt. Cảm ơn –

0

Tôi đã tìm thấy truy vấn tương tự như bạn trong một số diễn đàn trực tuyến và đây là có người đề nghị đầu ra như

Lưu ý: tham khảo từ http://www.unix.com/unix-linux-applications/81388-read-position-mouse-cursor.html, tác giả dưới niêm yết là daggilli, người dùng đã đăng ký của diễn đàn trực tuyến UNIX. Tín dụng dưới đây được đăng dưới dạng đầy đủ của nó sẽ chuyển sang daggilli.

Đây là mã hoàn chỉnh cho ứng dụng Qt tôi đã ném cùng nhau trong khoảng mười phút (gọi là crosshair) hiển thị tọa độ chuột hiện tại trong cửa sổ. Bạn có thể kéo đủ nó ra để có ích. Đây là Qt 3.1, nhưng Qt 4 không khác gì nhiều. Bạn sẽ cần các thư viện phát triển Qt, không chỉ là các runtimes. Mã này bao gồm hai tập tin, crosshair.h và crosshair.cpp.

crosshair.h:

Code:

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

Code:

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

Để xây dựng này, đặt cả hai tập tin trong một thư mục gọi là crosshair . cd vào thư mục đó và gõ Code:

qmake -project 
qmake 
make 

này không có gì phức tạp hơn kế thừa từ một QLabel, thiết lập một bộ đếm thời gian để chạy 20x trong một giây, lấy con trỏ hiện tại tọa độ và viết chúng vào văn bản của nhãn. Nhấp vào trong cửa sổ sẽ đóng cửa sổ. Tôi sử dụng nó để sửa lỗi liên kết trong JavaScript khi tôi đang đặt ra các đối tượng.

Bạn có thể mở tệp trong hàm tạo của lớp Crosshair để lưu trữ dữ liệu của bạn và sử dụng gettimeofday (2) để nhận dấu thời gian. Không có gì nói Qt phải chạy trong chế độ GUI (bạn có thể nói rõ ràng là không phải trong constructor QApplication).

Qt từ Trolltech: http://doc.trolltech.com

+0

Tôi biết cách theo dõi vị trí con trỏ chuột. Tôi cần phải theo dõi vị trí con trỏ văn bản. Cảm ơn sự giúp đỡ của bạn –

Các vấn đề liên quan