0
#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();
}
}

i クリックしたマウスの位置を表示したいui->plainTextEdit->appendPlainText(QString(" x , y = ")+QString::number(px)+QString::number(py));この位置を表示するために使用します。マウスをクリックしても、表示されるだけですx,y = 0 0。どうして?

4

2 に答える 2

0

全体のアイデアは悪いです。このイベントは、シグナルとスロットを介して my_qlabel クラス内で処理する必要があります。私はこのようなものを提案します(マウスクリックの座標で信号を発します):

ヘッダー 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());
}

メインウィンドウ.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;
}
于 2013-05-23T19:30:22.523 に答える
0

でアクセスされるpyおよびは、のメンバ変数であり、 からは見えません。pxmy_qlabel::mousePressEventmy_qlabelMainWindow::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;

しかし、これはそれほどエレガントではなく、同じ方法で通知されません。

検討すべきもう 1 つのアイデアはQPoint、2 つの の代わりにオブジェクトを使用することintです。

それが役立つことを願っています。

于 2013-05-23T19:22:37.490 に答える