Я новичок в C ++, но стараюсь учиться. Я получаю две ошибки, и я не знаю почему, это:

  1. В конструкторе MyLabel :: MyLabel (QWidget *):
  2. Qualified-id в объявлении перед '(' token -line 7
  3. Qualified-id в объявлении перед '(' token -line20

Мой код выглядит следующим образом:

Mylabel.cpp:

#include "mylabel.h"
#include "ui_mainwindow.h"

MyLabel::MyLabel(QWidget *parent) :
    QWidget(parent)
{
    void MyLabel::MyLabel()
    {
        this->setAlignment(Qt::AlignCenter);

        //Default Label Value
        this->setText("No Value");

        //set MouseTracking true to capture mouse event even its key is not pressed
        this->setMouseTracking(true);
    }



    void MyLabel::mouseMoveEvent(QMouseEvent * event)
    {
        //Show x and y coordinate values of mouse cursor here
        this->setText("X:" + QString::number(event->x()) + "-- Y:" + QString::number(event->y()));
    }


}        

Mylabel.h:

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QObject>
#include <QApplication>
#include <QMainWindow>
#include <QMouseEvent>

class MyLabel : public QWidget
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = 0);
    ~MyLabel();

    void mouseMoveEvent(QMouseEvent * event);

signals:

};

#endif // MYLABEL_H 

Main.cpp

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

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow *window = new QMainWindow();

    window->setWindowTitle(QString::fromUtf8("QT - Capture Mouse Move"));
    window->resize(300, 250);

    QWidget *centralWidget = new QWidget(window);
    QHBoxLayout* layout = new QHBoxLayout(centralWidget);

    MyLabel* CoordinateLabel = new MyLabel();
    layout->addWidget(CoordinateLabel);

    window->setCentralWidget(centralWidget);

    window->show();
    return app.exec();
}

Mainwindow.cpp пуст

0
JLREng 26 Окт 2015 в 17:13

2 ответа

Лучший ответ

Чтобы реализовать свой собственный ярлык, вы должны унаследовать свой класс от стандартного класса QLabel Qt как:

class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = 0);
    ~MyLabel();
protected:
    void mouseMoveEvent(QMouseEvent * event);
};

К сожалению, в C ++ вы не можете определить функцию внутри другой функции, как это было в конструкторе MyLabel::MyLabel(). Просто напишите это так:

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    setAlignment(Qt::AlignCenter);

    //Default Label Value
    setText("No Value");

    //set MouseTracking true to capture mouse event even its key is not pressed
    setMouseTracking(true);
}

ОБНОВЛЕНИЕ

Я бы реализовал обработку события перемещения мыши следующим образом:

void MyLabel::mouseMoveEvent(QMouseEvent * event)
{
    // Show x and y coordinate values of mouse cursor here
    QString txt = QString("X:%1 -- Y:%2").arg(event->x()).arg(event->y());
    setText(txt);
}
0
vahancho 26 Окт 2015 в 17:57

Вы получаете сообщение об ошибке, если пытаетесь определить функции внутри своего конструктора. MyLabel::MyLabel(QWidget *parent) так будет

MyLabel::MyLabel(QWidget *parent) : QWidget(parent)
{
    this->setAlignment(Qt::AlignCenter);

    //Default Label Value
    this->setText("No Value");

    //set MouseTracking true to capture mouse event even its key is not pressed
    this->setMouseTracking(true);
}

И тогда определение для mouseMoveEvent должно следовать после конструктора

void MyLabel::mouseMoveEvent(QMouseEvent * event)
{
    //Show x and y coordinate values of mouse cursor here
    this->setText("X:" + QString::number(event->x()) + "-- Y:" + QString::number(event->y()));
}

РЕДАКТИРОВАТЬ:

Как указано в комментариях, setAlignment и setText не являются членами QWidget, поэтому, если они не являются членами MyLable, вам нужно будет удалить их, иначе он не будет компилироваться .

1
NathanOliver 26 Окт 2015 в 14:26