Hi guys:
I have a problem about the setMouseTracking(). I want to receive the mouseMoveEvent even if no mouse button pressed. As the Qt Document says, I set the mouseTracking property TRUE by setMouseTracking(TRUE),but itdoesn't work.
My app has a MainWindow and a QWidgetStack as the MainWindow's main widget. The WidgetStack contains two widgets. One is QTextEdit, another is QCanvasView. Since I want to deal with the mouseMoveEvent within the QCanvasView, I subclass my own canvasview from QCanvasView. Then in the constructor of my own canvasview I set
the mouseTracking property TRUE. But I'm confused that the contentsMouseMoveEvent() is only called when a mousebutton pressed and moved just as mouseTracking is FALSE.

bellow is my code:
mainwindow.h
Qt Code:
  1. #include <qdockwindow.h>
  2. #include <qwidgetstack.h>
  3. #include <qtoolbutton.h>
  4. #include <qtextedit.h>
  5. #include <qcanvas.h>
  6. #include "canvasview.h"
  7. class MainWindow: public QMainWindow
  8. {
  9. Q_OBJECT
  10. public:
  11. MainWindow(QWidget *parent=0,const char* name = 0);
  12. private slots:
  13. void switchToolBarMode();
  14. void switchCentralWidgetMode(int);
  15. private:
  16. void init();
  17. QWidgetStack* centralWidgetStack;
  18. QDockWindow* toolBarDockWindow;
  19. QWidgetStack* toolBarStack;
  20. QToolButton* graphicButton;
  21. QToolButton* quitButton;
  22. QTextEdit *textEdit;
  23. CanvasView* canvasView;
  24. QCanvas* canvas;
  25. bool toolBarMode;
  26. };
  27. #endif
To copy to clipboard, switch view to plain text mode 

mainwindow.cpp
Qt Code:
  1. #include "mainwindow.h"
  2. #include "canvasview.h"
  3. #include <qmainwindow.h>
  4. #include <qapplication.h>
  5. #include <qlayout.h>
  6.  
  7. MainWindow::MainWindow(QWidget* parent, const char* name)
  8. :QMainWindow(parent,name)
  9. {
  10. int screenW;
  11. int screenH;
  12. screenW = QApplication::desktop()->width();
  13. screenH = QApplication::desktop()->height();
  14. this->resize(screenW,screenH);
  15. toolBarMode = TRUE;
  16. init();
  17. }
  18.  
  19. void MainWindow::init()
  20. {
  21. toolBarDockWindow = new QDockWindow(QDockWindow::InDock,this,"toolbardockwindow",0);
  22. toolBarDockWindow->setOrientation(Qt::Horizontal);
  23. toolBarDockWindow->setHorizontallyStretchable(TRUE);
  24. toolBarDockWindow->setVerticallyStretchable(TRUE);
  25. toolBarDockWindow->setMovingEnabled(FALSE);
  26. this->moveDockWindow(toolBarDockWindow,Qt::DockBottom);
  27.  
  28. toolBarStack = new QWidgetStack(toolBarDockWindow);
  29. toolBarDockWindow->setWidget(toolBarStack);
  30.  
  31. QWidget* editToolBar = new QWidget(toolBarStack);
  32. QHBoxLayout* editToolBarLayout = new QHBoxLayout(editToolBar,6,6);
  33. QWidget* graphicToolBar = new QWidget(toolBarStack);
  34. QHBoxLayout* graphicToolBarLayout = new QHBoxLayout(graphicToolBar,6,6);
  35. toolBarStack->addWidget(editToolBar,0);
  36. toolBarStack->addWidget(graphicToolBar,1);
  37.  
  38. graphicButton = new QToolButton(editToolBar,"graphicutton");
  39. graphicButton->setUsesTextLabel(TRUE);
  40. graphicButton->setTextLabel("Graphic",FALSE);
  41. graphicButton->setFont(QFont("Times",20,QFont::Bold));
  42. editToolBarLayout->addWidget(graphicButton);
  43.  
  44. QSpacerItem* editToolBarSpacer = new QSpacerItem(0,0,QSizePolicy::Expanding,QSizePolicy::Minimum);
  45. editToolBarLayout->addItem(editToolBarSpacer);
  46. quitButton = new QToolButton(graphicToolBar,"quitbutton");
  47. quitButton->setUsesTextLabel(TRUE);
  48. quitButton->setTextLabel("Return",FALSE);
  49. quitButton->setFont(QFont("Times",20,QFont::Bold));
  50. graphicToolBarLayout->addWidget(quitButton);
  51.  
  52. QSpacerItem* graphicToolBarSpacer = new QSpacerItem(0,0,QSizePolicy::Expanding,QSizePolicy::Minimum);
  53. graphicToolBarLayout->addItem(graphicToolBarSpacer);
  54.  
  55. toolBarStack->raiseWidget(0);
  56.  
  57. connect(graphicButton,SIGNAL(clicked()),this,SLOT(switchToolBarMode()));
  58. connect(quitButton,SIGNAL(clicked()),this,SLOT(switchToolBarMode()));
  59.  
  60. //construct the QWidgetStack as the MainWindow's main widget.
  61. centralWidgetStack = new QWidgetStack(this);
  62. //add textedit into the QWidgetStack.
  63. textEdit = new QTextEdit(centralWidgetStack,"textedit");
  64. textEdit->setTextFormat(Qt::PlainText);
  65. textEdit->setFocus();
  66. centralWidgetStack->addWidget(textEdit,0);
  67. //add canvasView into the QWidgetStack.
  68. canvas = new QCanvas(this);
  69. canvasView = new CanvasView(canvas,centralWidgetStack,"canvasview");
  70. centralWidgetStack->addWidget(canvasView,1);
  71.  
  72. this->setCentralWidget(centralWidgetStack);
  73. centralWidgetStack->raiseWidget(0);
  74. connect(toolBarStack,SIGNAL(aboutToShow(int)),this,SLOT(switchCentralWidgetMode(int)));
  75.  
  76. }
  77. void MainWindow::switchToolBarMode()
  78. {
  79. if(toolBarMode){
  80. toolBarStack->raiseWidget(1);
  81. }else{
  82. toolBarStack->raiseWidget(0);
  83. }
  84. toolBarMode = !toolBarMode;
  85.  
  86. }
  87.  
  88. void MainWindow::switchCentralWidgetMode(int i)
  89. {
  90. centralWidgetStack->raiseWidget(i);
  91. }
To copy to clipboard, switch view to plain text mode 

canvasview.h
Qt Code:
  1. #ifndef CANVASVIEW_H
  2. #define CANVASVIEW_H
  3. #include <qcanvas.h>
  4.  
  5. class CanvasView:public QCanvasView
  6. {
  7. public:
  8. CanvasView(QCanvas* canvas, QWidget* parent, const char* name);
  9. protected:
  10. void contentsMouseMoveEvent(QMouseEvent* e);
  11.  
  12. };
  13. #endif
To copy to clipboard, switch view to plain text mode 

canvasview.cpp
Qt Code:
  1. #include "canvasview.h"
  2. #include <qcanvas.h>
  3. #include <qapplication.h>
  4. CanvasView::CanvasView(QCanvas* canvas, QWidget* parent, const char* name)
  5. :QCanvasView(canvas,parent,name)
  6. {
  7. setMouseTracking(TRUE);
  8. }
  9.  
  10. void CanvasView::contentsMouseMoveEvent(QMouseEvent* e)
  11. {
  12. qWarning("The MouseMoveEvent has been received!");
  13. }
To copy to clipboard, switch view to plain text mode 

main.cpp
Qt Code:
  1. #include <qapplication.h>
  2. #include "mainwindow.h"
  3. #include "canvasview.h"
  4.  
  5. int main(int argc,char* argv[])
  6. {
  7. QApplication app(argc,argv);
  8. MainWindow* mainwindow = new MainWindow();
  9. app.setMainWidget(mainwindow);
  10. mainwindow->show();
  11. return app.exec();
  12. }
To copy to clipboard, switch view to plain text mode