mousepressevent()有些错误

时间:2013-05-23 18:00:57

标签: qt

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMouseEvent>
#include <QDebug>
#include "my_qlabel.h"
#include<QTimer>
int px;
int py;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
tmrTimer = new QTimer(this);
connect(tmrTimer,SIGNAL(timeout()),this,SLOT(showthepositionofmouse()));
tmrTimer->start(20);
}

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

void MainWindow::showthepositionofmouse()
{
ui->plainTextEdit->appendPlainText(QString(" x ,  y = ")+QString::number(px)+QString::number(py));
}
void my_qlabel::mousePressEvent(QMouseEvent *event)
{ 
if (event->button()==Qt::RightButton){
    px = event->x();
    py = event->y();
}
}

我想显示点击鼠标的位置 我用ui->plainTextEdit->appendPlainText(QString(" x , y = ")+QString::number(px)+QString::number(py));来显示这个位置。虽然我单击鼠标,但它只显示x,y = 0 0。为什么?

2 个答案:

答案 0 :(得分:0)

py中访问的pxmy_qlabel::mousePressEventmy_qlabel的成员变量,MainWindow::showthepositionofmouse不可见。

如果您希望它们可见,您应该使用信号和插槽发送它们。

http://qt-project.org/doc/qt-4.8/signalsandslots.html

以下是实现它的方法:

在my_qlabel.h中有类似这样的内容:

class my_qlabel : public QLabel
{
    Q_OBJECT

signals:
    void right_click_xy(int x, int y);
    // ...constructor and other functions

public slots:
    void mousePressEvent(QMouseEvent *event)
    { 
        int px, py;
        if (event->button()==Qt::RightButton){
            px = event->x();
            py = event->y();
            emit right_click_xy(px, py);
        }
    }
}

在mainwindow.h中有这样的东西:

class MainWindow : public QMainWindow
{
    Q_OBJECT

    // ... constructor and other functions
public slots:
    void on_display_click_xy(int px, int py)
    {
        qDebug() << "Received xy over signal slot:" << px << py;
        ui->plainTextEdit->appendPlainText(QString(" x ,  y = ")+QString::number(px)+QString::number(py));
    }
}

在MainWindow构造函数中放入以下内容:

QObject::connect(ui->my_qlabel_instance, SIGNAL(right_click_xy(int,int)), 
    this, SLOT(on_display_click_xy(int, int)));

执行此操作的另一种方法,但不是犹太教,可以深入查看您的ui对象并以此方式访问pxpy

qDebug() << ui->my_qlabel_instance->py;

但这不是那么优雅,并没有以同样的方式发出信号。

要研究的另一个想法是使用QPoint对象而不是两个int

希望有所帮助。

答案 1 :(得分:0)

整个想法很糟糕,你必须通过信号和插槽在my_qlabel类中处理这个事件,而不是在它之外。我会建议像这样的东西(用鼠标点击坐标发出信号):

Header my_qlabel.h:

#ifndef MY_QLABEL_H
#define MY_QLABEL_H

#include <QLabel>
#include <QPoint>
#include <QEvent>

class my_qlabel : public QLabel
{
Q_OBJECT
public:
    my_qlabel( const QString & text="", QWidget * parent = 0 );

signals:
    void clicked(QPoint pos);
protected:
    void mouseReleaseEvent ( QMouseEvent * event );
};

#endif // MY_QLABEL

来源my_qlabel.cpp:

#include "my_qlabel.h"
#include <QMouseEvent>
my_qlabel::my_qlabel( const QString & text, QWidget * parent )
:QLabel(parent)
{
    setText(text);
}
void my_qlabel::mouseReleaseEvent ( QMouseEvent * event )
{
    emit clicked(event->pos());
}

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "my_qlabel.h"
#include <QtGui/QWidget>

class MainWindow : public QWidget
{
Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void showthepositionofmouse(QPoint pos);
};
#endif // MAINWINDOW_H

和mainwindow.cpp:

#include "mainwindow.h"
#include <QDebug>
#include <QPoint>
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
    my_qlabel* label=new my_qlabel("Text of my label",this);
    label->setAlignment(Qt::AlignCenter);
    QGridLayout *lay=new QGridLayout(this);
    this->setLayout(lay);
    lay->addWidget(label,0,0,1,1);

    connect(label,SIGNAL(clicked(QPoint)),this,SLOT(showthepositionofmouse(QPoint)));
}

MainWindow::~MainWindow()
{

}

void MainWindow::showthepositionofmouse(QPoint pos)
{
    qDebug()<< "Clicked, position="<<pos;
}