MousePresseEvent()出现一些错误 #包括“mainwindow.h” #包括“ui_main window.h” #包括 #包括 #包括“my_qlabel.h” #包括 int-px; int-py; 主窗口::主窗口(QWidget*父窗口): QMainWindow(父级), 用户界面(新用户界面::主窗口) { 用户界面->设置用户界面(此); tmrTimer=新的QTimer(本); 连接(tmrTimer,信号(timeout()),此,插槽(显示位置fMouse()); tmrTimer->start(20); } MainWindow::~MainWindow() { 删除用户界面; } void主窗口::显示位置fmouse() { 用户界面->明文编辑->追加明文(QString(“x,y=)+QString::number(px)+QString::number(py)); } void my_qlabel::MousePresseEvent(QMouseEvent*事件) { 如果(事件->按钮()==Qt::RightButton){ px=事件->x(); py=事件->y(); } }
我想显示鼠标单击的位置MousePresseEvent()出现一些错误 #包括“mainwindow.h” #包括“ui_main window.h” #包括 #包括 #包括“my_qlabel.h” #包括 int-px; int-py; 主窗口::主窗口(QWidget*父窗口): QMainWindow(父级), 用户界面(新用户界面::主窗口) { 用户界面->设置用户界面(此); tmrTimer=新的QTimer(本); 连接(tmrTimer,信号(timeout()),此,插槽(显示位置fMouse()); tmrTimer->start(20); } MainWindow::~MainWindow() { 删除用户界面; } void主窗口::显示位置fmouse() { 用户界面->明文编辑->追加明文(QString(“x,y=)+QString::number(px)+QString::number(py)); } void my_qlabel::MousePresseEvent(QMouseEvent*事件) { 如果(事件->按钮()==Qt::RightButton){ px=事件->x(); py=事件->y(); } },qt,Qt,我想显示鼠标单击的位置 我使用ui->明文编辑->追加明文(QString(“x,y=”)+QString::number(px)+QString::number(py))以显示此位置。虽然我单击鼠标,但它只显示x,y=0。为什么会这样?在my_qlabel::MousePresseEvent中访问的py和px是my_qlabel的成员变量,对Main Window::showthepositionofmouse不可见 如果您希望它们可见,则应使用信号和插槽发送它们 以下是一种实现方法: 在m
我使用
ui->明文编辑->追加明文(QString(“x,y=”)+QString::number(px)+QString::number(py))代码>以显示此位置。虽然我单击鼠标,但它只显示x,y=0
。为什么会这样?在my_qlabel::MousePresseEvent
中访问的py
和px
是my_qlabel
的成员变量,对Main Window::showthepositionofmouse
不可见
如果您希望它们可见,则应使用信号和插槽发送它们
以下是一种实现方法:
在my_qlabel.h中,有如下内容:
#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();
}
}
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中,有如下内容:
#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();
}
}
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);
}
}
}
另一种替代方法是深入到您的ui
对象中,并以这种方式访问px
和py
QObject::connect(ui->my_qlabel_instance, SIGNAL(right_click_xy(int,int)),
this, SLOT(on_display_click_xy(int, int)));
qDebug()我的标签实例->py;
但这并不优雅,也不是以同样的方式发出信号
研究的另一个想法是使用QPoint
对象,而不是两个int
s
希望能有所帮助。整个想法都不好,您必须在my_qlabel类中通过信号和插槽处理此事件,而不是在my_qlabel类之外。我建议这样做(用鼠标点击的坐标发出信号):
标题my_qlabel.h:
qDebug() << ui->my_qlabel_instance->py;
\ifndef MY\u QLABEL\H
#定义我的标签
#包括
#包括
#包括
类my_qlabel:公共qlabel
{
Q_对象
公众:
我的qlabel(const QString&text=“”,QWidget*parent=0);
信号:
点击无效(QPoint pos);
受保护的:
无效mouseReleaseEvent(QMouseEvent*事件);
};
#endif//myqlabel
来源my_qlabel.cpp:
#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.h”
#包括
my_qlabel::my_qlabel(常量QString&text,QWidget*父项)
:QLabel(父级)
{
setText(文本);
}
void my_qlabel::mouseReleaseEvent(QMouseEvent*事件)
{
发出单击(事件->位置());
}
mainwindow.h:
#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());
}
\ifndef主窗口
#定义主窗口
#包括“my_qlabel.h”
#包括
类主窗口:公共QWidget
{
Q_对象
公众:
主窗口(QWidget*父窗口=0);
~main窗口();
公众时段:
无效显示房屋位置(QPoint位置);
};
#endif//main窗口
和mainwindow.cpp:
#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.h”
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QWidget(父级)
{
my_qlabel*label=新的my_qlabel(“我的标签文本”,this);
标签->设置对齐(Qt::AlignCenter);
QGridLayout*lay=新的QGridLayout(本);
此->设置布局(布局);
lay->addWidget(标签,0,0,1,1);
连接(标签、信号(点击(QPoint))、此、插槽(显示房屋位置(QPoint));
}
MainWindow::~MainWindow()
{
}
void主窗口::显示房屋位置(QPoint位置)
{
qDebug()在您的行py=event->y();
之后插入时,qDebug()x()y();
显示什么?