• 14173阅读
  • 8回复

QT的MousemoveEvent事件光标获得(急急,请高手赐教) [复制链接]

上一主题 下一主题
离线yangyu0411
 
只看楼主 正序阅读 楼主  发表于: 2009-12-26
为什么我直接调用QWidget::QMousemoveEvent(除非按下左键)读不到光标坐标?我把所有控件的setMouseTracking为true。
条件:
1>.通过QMousemoveEvent事件获取QWidget上面的控件QTabWidget上面的控件QGroupbox里面的光标坐标。
2>.QMousemoveEvent事件获取光标执行时鼠标左键没有按下!
离线ziteng
只看该作者 8楼 发表于: 2009-12-28
引用楼主yangyu0411于2009-12-26 15:03发表的 QT的MousemoveEvent事件光标获得(急急,请高手赐教) :
为什么我直接调用QWidget::QMousemoveEvent(除非按下左键)读不到光标坐标?我把所有控件的setMouseTracking为true。
条件:
1>.通过QMousemoveEvent事件获取QWidget上面的控件QTabWidget上面的控件QGroupbox里面的光标坐标。
2>.QMousemoveEvent事件获取光标执行时鼠标左键没有按下!


case Qt::LeftButton:
    break;
case Qt::RightButton:
       break;
case Qt::NoButton:
                     break;
单单最后一个读不到?
离线yangyu0411
只看该作者 7楼 发表于: 2009-12-28
引用第6楼guofu089于2009-12-27 11:41发表的  :
可能是你定义QWidget类的子控件覆盖了该类的所有位置,所以你在Widget上是获取不到鼠标事件的,应为他不具有焦点。
         class MainWindow : public QMainWindow
         {
         public:
.......



我分析原因就和你说的差不多,我现在就试试你的代码!谢谢先!
离线guofu089
只看该作者 6楼 发表于: 2009-12-27
可能是你定义QWidget类的子控件覆盖了该类的所有位置,所以你在Widget上是获取不到鼠标事件的,应为他不具有焦点。

         class MainWindow : public QMainWindow
         {
         public:
             MainWindow();

         protected:
             bool eventFilter(QObject *obj, QEvent *ev);

         private:
             QTextEdit *textEdit;
         };

         MainWindow::MainWindow()
         {
             textEdit = new QTextEdit;
             setCentralWidget(textEdit);

             textEdit->installEventFilter(this);
         }

         bool MainWindow::eventFilter(QObject *obj, QEvent *event)
         {
             if (obj == textEdit) {
                 if (event->type() == QEvent::KeyPress) {
                     QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
                     qDebug() << "Ate key press" << keyEvent->key();
                     return true;
                 } else {
                     return false;
                 }
             } else {
                 // pass the event on to the parent class
                 return QMainWindow::eventFilter(obj, event);
             }
         }

这段代码是在QOject 的帮助文档中的,可以执行,不过要包含相关头文件。

你可以把QEvent::KeyPress改成是 QEvent::MouseMove试试看能不能满足你的需求。如:
if (obj == textEdit) {
               if (event->type() == QEvent::MouseMove) {
                     QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
                     qDebug() << "mouse x,y:" << mouseEvent->pos().x()<<"\t"<<mouseEvent->pos().y();
                     return true;
                 } else {
                     return false;
                 }
             }
[ 此帖被guofu089在2009-12-27 13:17重新编辑 ]
离线dbzhang800

只看该作者 5楼 发表于: 2009-12-26
引用楼主yangyu0411于2009-12-26 15:03发表的 QT的MousemoveEvent事件光标获得(急急,请高手赐教) :
为什么我直接调用QWidget::QMousemoveEvent(除非按下左键)读不到光标坐标?我把所有控件的setMouseTracking为true。
条件:
1>.通过QMousemoveEvent事件获取QWidget上面的控件QTabWidget上面的控件QGroupbox里面的光标坐标。
2>.QMousemoveEvent事件获取光标执行时鼠标左键没有按下!


用 eventFilter 吧,也不用为每个widget都设置mouseTracking,简单易行
离线yangyu0411
只看该作者 4楼 发表于: 2009-12-26
引用第1楼mecland于2009-12-26 15:12发表的  :
this->setMouseTracking(true)试试


请看问题:我把所有控件的setMouseTracking为true。
离线yangyu0411
只看该作者 3楼 发表于: 2009-12-26
引用第2楼benbenmajia于2009-12-26 15:15发表的  :
最好在提问的时候把相关的代码发上来



代码原理其实很简单的(由于其他原因不方便,清凉解):我定义了一个QWidget类,这个类上面有QTabWidget控件,QTabWidget控件上面又有QGroupbox控件,QLabe等一些控件。然后给这个QWidget类写MousemoveEvent函数,鼠标移动获取光标位置坐标。
离线benbenmajia

只看该作者 2楼 发表于: 2009-12-26
最好在提问的时候把相关的代码发上来
安然.....
离线mecland
只看该作者 1楼 发表于: 2009-12-26
this->setMouseTracking(true)试试
快速回复
限100 字节
 
上一个 下一个