2009-10-17 8 views
7

テキストカーソルの位置にあるQMenuオブジェクトをQPlainTextEditに実行します。私の問題は、QTextCursorがText(文字のインデックス)の位置だけで定義されているということです。テキストカーソルのグローバルな位置を見つける方法は?

QTextCursorのグローバルポジションを見つけるにはどうすればよいですか? QMenuを開くテキストカーソルの位置を見つけるためにQTextCursor以外のオブジェクトを使用する必要がありますか?

ありがとうございます。

答えて

8

自分自身を試みたことはありませんでしたが、QPlainTextEdit::cursorRect()は機能しませんか?これは、ビューポートの座標にカーソルの位置を与える必要があります。 viewport()を使用してビューポートを取得し、viewport()->mapToGlobal()を使用してローカル位置をグローバルにマップできます。

+0

がQCursorのために存在するように、私はグローバル位置を必要とするのに対し、QPlainTextEditにカーソルの相対位置を返すcursorRect。 –

+1

まあ、私はあなたが 'editor-> viewport() - > mapToGlobal()'について知っていると思った: –

+0

私はこれを知らなかった。それはうまく動作します。ありがとう –

0

私はいくつかのオンラインフォーラムであなたに似たクエリを発見したと、ここで誰かが

注意として出力示唆しています:http://www.unix.com/unix-linux-applications/81388-read-position-mouse-cursor.htmlから参考に、投稿がdaggilliある下回っの著者、UNIXオンラインフォーラムの登録ユーザ。以下の投稿の完全な形のクレジットはダギリになります。

これはQtアプリケーションの完全なコードです(十字線と呼ばれます)。これは現在のマウス座標をウィンドウに表示します。あなたはそれを十分に引き出して有用になるかもしれません。これはQt 3.1ですが、Qt 4はそれほど大きな違いはありません。ランタイムだけでなく、Qt開発ライブラリが必要です。このコードは、crosshair.hとcrosshair.cppという2つのファイルで構成されています。

crosshair.h:

コード:

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

コード:

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

これを構築するには、十字線というディレクトリに両方のファイルを置きます。そのディレクトリにcdと コードを入力します。

qmake -project 
qmake 
make 

これはQLabelから継承するよりも、より複雑な何もしませんが、20倍をもう一度を実行し、現在のカーソル座標を取得し、ラベルのテキストにそれらを書き込むためのタイマーを設定します。ウィンドウをクリックすると閉じます。私はオブジェクトをレイアウトしているときに、JavaScriptのアラインメントバグを修正するためにそれを使用します。

Crosshairクラスのコンストラクタでファイルを開いてデータを保存し、gettimeofday(2)を使用してタイムスタンプを取得できます。何もQtはGUIモードで動作しなければならないとは言いません(QApplicationコンストラクタで明示的に指定することはできません)。 Trolltechのから

のQt:http://doc.trolltech.com

+0

私はトラックのマウスカーソルの位置を知っています。私はテキストのカーソルの位置を追跡する必要があります。とにかく助けてくれてありがとう –

関連する問題