Qt实现控件内捕获鼠标位置

Qt下实时获取鼠标移动的位置很简单,只要重载mouseMoveEvent即可,但如何获取控件内的光标位置呢?

这里以获取QListWidget内的光标位置为例,进行介绍。

1. 创建自定义的ListWidget:

   自定义ListWidget的头文件

 1 class customWidget :public QListWidget
 2 {
 3     Q_OBJECT
 4 public:
 5     customWidget(QWidget* parent = 0);
 6     ~customWidget();
 7 
 8 signals:
 9     void getPosition(QPointF pt);//信号函数,用于传递光标在控件中的位置
10 
11 protected:
12     virtual void mouseMoveEvent(QMouseEvent* event);
13 };

  自定义ListWidget的实现

 1 customWidget::customWidget(QWidget* parent):QListWidget(parent)
 2 {
 3 }
 4 
 5 customWidget::~customWidget()
 6 {
 7 }
 8 
 9 void customWidget::mouseMoveEvent(QMouseEvent * event)
10 {
11     QPointF position = event->localPos();//获取光标位置
12     emit getPosition(position);//发射信号
13 }

2. 将自定义控件放入Qt界面

 在Qt界面中拖入一个QListWidget控件,在“对象查看器”中右击该控件所属的项,选择“提升为”,在弹出的对话框中输入自定义ListWidget的头文件名

  

3. 调用自定义控件

  主界面的头文件 

 1 class QtWidgetDemo : public QMainWindow
 2 {
 3     Q_OBJECT
 4 
 5 public:
 6     QtWidgetDemo(QWidget *parent = Q_NULLPTR);
 7 
 8     private slots:
 9     void setStatusBar(QPointF pt);//设置信号接收槽
10 
11 private:
12     Ui::QtWidgetDemoClass ui;
13 };

  主界面的实现

QtWidgetDemo::QtWidgetDemo(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    ui.statusBar->showMessage("test mouseTracking");
    ui.listWidget->setMouseTracking(true);
    //connect(ui.listWidget, SIGNAL(getPosition(QPointF)), this, SLOT(setStatusBar(QPointF)));
    connect(ui.listWidget, &customWidget::getPosition, this, &QtWidgetDemo::setStatusBar);//信号与槽绑定
}

void QtWidgetDemo::setStatusBar(QPointF pt)
{
    QString strShow = QString("location coord: X:%1 Y:%2").arg(pt.x()).arg(pt.y());
    ui.statusBar->showMessage(strShow);//将光标坐标显示到状态栏
}

4. 结果

 

posted on 2018-03-16 17:29  JohnHuang  阅读(5066)  评论(0)    收藏  举报