2015-10-26 4 views
0

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

  1. В конструкторе «MyLabel :: MyLabel (QWidget *)»:
  2. Квалифицированные-идентификатор в декларации перед «(» маркер - линия 7
  3. Квалифицированные-идентификатор в декларации перед '(' маркер -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

Вы функции-члены, определенного в организме конструктора, переместите их за его пределы. –

+0

Использование стороннего графического интерфейса - это не совсем лучший способ изучить язык программирования C++. –

+1

Возможно, вы захотите подкласса QLabel, а не QWidget. @ChristianHackl Скажи, что хочешь, но вот как некоторые из моих друзей изначально узнали С ++. Чаще всего интереснее видеть ваше приложение на экране, чем, по крайней мере, выводимый текст. –

ответ

0

Для того, чтобы реализовать свой собственный лейбл, вы должны получить свой класс от стандартного класса 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); 
} 

UPDATE

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

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

Понял, я не видел, что я там делал. Теперь у меня есть другой вопрос, как реализовать функцию MouseMoveEvent()? Я получаю ошибки, говоря, что он не идентифицирует членов внутри него. – JLREng

+0

Хорошо, вижу. Я сделал так, как сказал, но теперь я получаю ту же ошибку, что и раньше, прежде чем задал этот вопрос. Ошибка: undefined ссылка на «MyLabel :: ~ MyLabel()» и неопределенная ссылка на «не виртуальный thunk» на MyLabel :: ~ MyLabel() ' – JLREng

+0

@JLREng, это потому, что вы объявляете деструктор 'MyLabel()' но не определил его. Просто добавьте 'MyLabel :: ~ MyLabel() {}' в ваш .cpp-файл или удалите '' MyLabel() 'объявление из файла заголовка, если вы не собираетесь его использовать. – vahancho

1

Вы получаете сообщение об ошибке вы пытаетесь определить функции внутри конструктора. 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())); 
} 

EDIT:

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

+0

Это не будет компилироваться, потому что класс 'QWidget' не имеет функций' setText() 'и' setAlignment() '. – vahancho

+0

Хорошо, я вижу. Я сделал это, как сказал, но теперь я получаю ту же ошибку, что и раньше, прежде чем задал этот вопрос. Ошибка: неопределенная ссылка на «MyLabel :: ~ MyLabel()» и неопределенная ссылка на «не виртуальный thunk to MyLabel :: ~ MyLabel()» – JLREng

Смежные вопросы