qt i dziwny błąd podczas tworzenia nowej klasy

0

Witam!

W swoim projekcie stworzyłem sobie nową klase w oddzielnym pliku .cpp i plik nagłówkowy dla tej klasy .h, ale coś jest nie tak, mimo że struktura tych plików jest identyczna jak np. a plikach dla klasy MainWindow. Klasa którą tworze nie ma jednak żadnego formularza, jest klasą która modyfikuje działanie QGraphicsView aby można było rysować po elementach wyświetlanych w widgecie tego typu. Błędy linkera jakie dostaje:

mainwindow.obj:-1: błąd:LNK2019: unresolved external symbol "public: __cdecl MyQGraphicsView::MyQGraphicsView(class QWidget *)" (??0MyQGraphicsView@@QEAA@PEAVQWidget@@@Z) referenced in function "private: void __cdecl MainWindow::on_pushButton1_clicked(void)" (?on_pushButton1_clicked@MainWindow@@AEAAXXZ)
debug\abc.exe:-1: błąd:LNK1120: 1 unresolved externals

Macie może jakieś pomysły co może być nie tak?

plik nagłówkowy nowo tworzonej klasy:

#ifndef MyQGraphicsView_H
#define MyQGraphicsView_H

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
#include <QMouseEvent>

namespace Ui {
class MyQGraphicsView;
}

class MyQGraphicsView : public QGraphicsView
{
    Q_OBJECT

public:
    explicit MyQGraphicsView(QWidget *parent = 0);
    ~MyQGraphicsView();

private slots:
    void mousePressEvent(QMouseEvent * e);

    void mouseReleaseEvent(QMouseEvent * e);

    void mouseDoubleClickEvent(QMouseEvent * e);

    void mouseMoveEvent(QMouseEvent * e);

private:
    Ui::MyQGraphicsView *ui;
    QGraphicsScene *scena;
};

#endif // MyQGraphicsView_H
0

Plik zawierający definicję konstruktora jest w projekcie?

0

tak, oczywiście

tak wygląda ten plik:

#include "myqgraphicsview.h"
#include <QPointF>

MyQGraphicsView::MyQGraphicsView(QWidget *parent) :
    QGraphicsView(parent),
    ui(new Ui::MyQGraphicsView)
{
    ui->setupUi(this);

    scena = new QGraphicsScene();
    this->setSceneRect(50, 50, 350, 350);
    this->setScene(scena);
}

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

void MyQGraphicsView::mousePressEvent(QMouseEvent * e)
{
    double rad = 1;
    QPointF pt = mapToScene(e->pos());
    scene->addEllipse(pt.x()-rad, pt.y()-rad, rad*2.0, rad*2.0,
        QPen(), QBrush(Qt::SolidPattern));
}

Ogólnie, gdyby ktoś z was miał jakiś inny, lepszy pomysł na rysowanie po zdjęciu, które jest wyświetlane w QGraphicsView i odczytywanie współrzędnych narysowanych kropek i kresek względem załadowanego obrazu to chętnie poznam i pogłębię swoją widzę o takie rozwiązania :)

1
public:
    explicit MyQGraphicsView(QWidget *parent = 0);
    ~Marker();

Ekhem.

0

Miałem na myśli znajdowanie się na liście plików w pliku .pro.

    explicit MyQGraphicsView(QWidget *parent = 0);
    ~Marker();

To się nawet nie powinno kompilować (błędna deklaracja destruktora innego typu)

0

@several oczywiście tu zaistniała pomyłka (bo coś takiego jak wyżej na pewno by się nie skompilowało) i jest tak:

public:
    explicit MyQGraphicsView(QWidget *parent = 0);
    ~MyQGraphicsView();

w pliku .pro wszystko się zgadza i pliki myqgraphicsview.h i .cpp się tam znadują

1

a "Marker" w liście inicjacyjnej konstruktora to co to jest?

0

Co dokładnie zawiera void MainWindow::on_pushButton1_clicked(void) ?
Oraz apropos

Ogólnie, gdyby ktoś z was miał jakiś inny, lepszy pomysł na rysowanie po zdjęciu, które jest wyświetlane w QGraphicsView i odczytywanie współrzędnych narysowanych kropek i kresek względem załadowanego obrazu to chętnie poznam i pogłębię swoją widzę o takie rozwiązania :)

jaki dokładnie efekt chcesz uzyskać,abstrahując od jakichkolwiek technikaliów?

0

Kod odpowiadający za korzystanie z tej klasy pod przyciskiem Button1 wygląda tak:

QGridLayout *okno1 = new QGridLayout(ui->graphicsView1); //tworze layout dla kontrolki graphicsView aby móc odczytać potem współrzędne rysowanych punktów
        oknoObrazu1->addWidget(new MyQGraphicView());

Ogólnie chodzi mi o to aby po wczytaniu zdjęcia do QGraphicView móc myszką zaznaczyć kilka kluczowych punktów czy kresek (tak robię z dwoma obrazami, które na podstawie tych kluczowych punktów będą ze sobą porównywane przez program w dalszej kolejności) a co za tym idzie muszę znać położenie tych punktów względem obrazu i zarówno punkty jak i same obrazy przekazać na nowy form gdzie te dwa obrazy mają być na siebie nałożone zgodnie z punktami kluczowymi.

Póki co myślę że najlepiej nadpisać metode mousePressEvent dla widgetu QGraphicView przez implementacje swojej klasy tego typu, aby po kliknięci na obraz rysował się jakiś kształt a potem odczytać jego współrzędne tak aby inny obraz mógł być obrócony/dopasowany do niego poprzez odpowiednie wyskalowanie i obrócenie zarówno jednego jak i tego drugiego, nakładanego obrazu. Jakieś pomysły?

0

Error LNK2019 to bardzo popularny blad w VS. Nie zawsze wynika z bledu programisty a srodowiska. Podobny kod pod linuxem na gcc pewnie by przeszedl.

0

No własnie dlatego sie was pytam co to może byc za cholerstwo, bo mi sie już pomysły wyczerpały :? Ktoś? Coś?

0

Ja zlalem qt z wykorzystaniem visualowego kompilatora i przenioslem sie na linuxa tam wszystko zawsze smiga a komunikaty bledow sa jednoznaczne i klarowne. Mozesz sie tez pomeczyc z gcc pod windowsem

0

Z dziedziczeniem po QObject sa zawsze te same problemy ;) Jesli za pierwszym razem nie zrobisz wszystkiego poprawnie i raz zostana wygenerowane zle pliki przy budowaniu to potem dopoki nie usuniesz recznie ich z katalogu budowania to sie nie skompiluje. Czyszczenie i przebudowa z poziomu IDE nie pomaga. Ja po prostu wywalam recznie caly katalog budowania i tyle. Dziwne ze te pliki nie sa podmieniane, ten blad juz od dawna wystepuje.

0

@Krycho o widzisz, rozświetliłeś mi trochę sytuacje - dzięki Ci! Zaraz spróbuje zlokalizować ten folder budowania i go usunąć :)

2

Jak coś się kaszani to zwykle pomaga Build | Run qmake

0

Build nie pomógł, dlatego jest post na forum :)

0

sposób na zlikwidowanie tego typu błędów linkera: Clean, Build, qmake - dzieki wielkie panowie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1