1

'我目前在尝试编译该程序时遇到问题。该程序应该在 GUI QWidget 上显示鼠标的坐标错误在 mainwindow.cpp 文件的第 6 行'

//header
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QApplication>
#include <QMainWindow>
#include <QMouseEvent>
#include <QMessageBox>
#include <QWidget>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();

    void mouseReleaseEvent(QMouseEvent * event);

    ~MainWindow();

private:
    Ui::MainWindow *ui;

    QMessageBox *msgBox;
};

#endif // MAINWINDOW_H

'主窗口.cpp 文件'

    #include "mainwindow.h"
    #include "ui_mainwindow.h"

MainWindow::MainWindow()
{
   MainWindow::mouseReleaseEvent (QMouseEvent * event);
}

void MainWindow::mouseReleaseEvent(QMouseEvent * event)
{
    msgBox = new QMessageBox();
    msgBox -> setWindowTitle("Coordinates");
    msgBox -> setText("You released the button");
    msgBox -> show();
}

MainWindow::~MainWindow()
{
    delete ui;
}

'主要.cpp'

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow *w = new MainWindow();

    w->setWindowTitle(QString::fromUtf8("QT-capture mouse release"));
            w->resize(300, 250);


    w->show();

    return a.exec();
}

请帮忙,我知道它与指针和可能的变异器有关,但我还看不到它。谢谢你。

4

1 回答 1

1

这是非法的:

MainWindow::MainWindow()
{
    // illegal:
    MainWindow::mouseReleaseEvent (QMouseEvent * event);
}

如果您希望手动调用处理程序,您需要创建一个事件并传递它:

MainWindow::MainWindow()
{
    QMouseEvent event;
    MainWindow::mouseReleaseEvent(&event);
}

但是您随后需要正确设置 QMouseEvent 属性/如果不知道您为什么要这样做,很难说出如何这样做。

你在做什么?这些事件是在鼠标活动时自动发出的,您不需要手动调用 mouseReleaseEvent,它会在您释放鼠标按钮时调用。

如果你想显示鼠标位置,我建议你:

  • 替换mouseReleaseEventmouseMoveEvent
  • 只需删除您的通话MainWindow::MainWindow()
  • 在主窗口的标签MainWindow::mouseMoveEvent(QMouseEvent * event)中写入鼠标坐标,而不是使用消息框(QString使用鼠标坐标格式化 a,使用QMouseEvent::pos更改标签文本QLabel::setText

像那样:

void MainWindow::mouseMoveEvent(QMouseEvent * event)
{ 
    std::stringstream str;
    str << "Mouse position is " << event->pos.x() << ";" << event->pos().y();
    ui->label->setText( str.str().c_str() );
}
于 2015-10-25T07:03:52.203 回答