在Qt中文论坛看到一篇帖子,教大家怎么在窗体中获取指针的坐标。下面是他的源码(原页面找不到了,不过还是谢谢这位坛友):
//MouseEvent.pro #------------------------------------------------- # # Project created by QtCreator 2011-03-29T10:00:44 # #------------------------------------------------- QT += core gui TARGET = MouseEvent TEMPLATE = app SOURCES += main.cpp/ mainwindow.cpp HEADERS += mainwindow.h //mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtGui/QMainWindow> #include <QLabel> #include <QStatusBar> #include <QMouseEvent> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: QLabel *labelStatus; QLabel *labelMousePos; protected: void mouseMoveEvent(QMouseEvent *e); void mousePressEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e); void mouseDoubleClickEvent(QMouseEvent *e); }; #endif // MAINWINDOW_H //mainwindow.cpp #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { this->setWindowTitle(tr("Get Mouse Event")); this->resize(600,600); this->move(0,0); labelStatus = new QLabel(this); labelStatus->setText(tr("Mouse Position")); labelStatus->setFixedWidth(105); labelMousePos = new QLabel(this); labelMousePos->setText(""); labelMousePos->setFixedWidth(100); statusBar()->addPermanentWidget(labelStatus); statusBar()->addPermanentWidget(labelMousePos); this->setMouseTracking(true); } MainWindow::~MainWindow() { } void MainWindow::mouseMoveEvent(QMouseEvent *e) { QString str = "("+QString::number(e->x())+","+QString::number(e->y())+")"; labelMousePos->setText(str); } void MainWindow::mousePressEvent(QMouseEvent *e) { QString str = "("+QString::number(e->x())+","+QString::number(e->y())+")"; if(e->button() == Qt::LeftButton) { statusBar()->showMessage(tr("Mouse Left Button Pressed:")+str); } else if(e->button() == Qt::RightButton) { statusBar()->showMessage(tr("Mouse Right Button Pressed:")+str); } else if(e->button() == Qt::MidButton) { statusBar()->showMessage(tr("Mouse Middle Button Pressed:")+str); } } void MainWindow::mouseReleaseEvent(QMouseEvent *e) { QString str = "("+QString::number(e->x())+","+QString::number(e->y())+")"; statusBar()->showMessage(tr("Mouse Released:") + str,3000); } void MainWindow::mouseDoubleClickEvent(QMouseEvent *e) { QString str = "("+QString::number(e->x())+","+QString::number(e->y())+")"; statusBar()->showMessage(tr("Mouse Double Clicked:") + str); } //main.cpp #include <QtGui/QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
自己也想学下这个,于是就自己新建了一个Qt Gui工程。结果怎么试都不成功。
他在MainWindow(QWidget *parent)函数中写了这么一句是关键:this->setMouseTracking(true);这句告诉程序自动获取鼠标轨迹。但是我在MainWindow(QWidget *parent)里也写了这句,但就是没用。每次都得点击,程序才会返回坐标。并不是自动获取的。
经过摸索,我发现是Qt Creator新建的工程中包含了QMainWindow、centralWidget、mainToolBar等。所以在MainWindow(QWidget *parent)中直接用“this->setMouseTracking(true);”是不行的。
最简单的方法:我们可以直接在QtDesigner中修改QMainWindow的MouseTracking参数为true。接着修改centralWidget的MouseTracking参数为true。这样当我们将鼠标在centralWidget中晃动的时候,程序就会自动返回指针的坐标了。如果想在其他widget,如mainToolBar,中获取鼠标的坐标,只需将其的MouseTracking参数设为true,即可。
此处注意:QMainWindow的MouseTracking参数一定要为true,否则窗体内的其他MouseTracking参数就没用了。