Problem z rysowaniem w Qt4

0

Witam. Mam problem z narysowaniem czegokolwiek w qt4. Program się kompiluje, ale nie widać żadnych efektów rysowania. Używam Qt Creator. Poniżej zamieszczam kod wszystkich plików jakie mam w programie. Zaznaczam że jestem początkujący :)

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <paintarea.h>
#include <QPainter>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    PaintArea *konrad;

private:
    Ui::MainWindow *ui;
    void rysunek(QPaintEvent *);
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    konrad = new PaintArea;
    konrad->show();
}

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

paintarea.h

#ifndef PAINTAREA_H
#define PAINTAREA_H

#include <QWidget>
#include <QPainter>

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

protected:
    void rysuj(QPaintEvent *event);

signals:

public slots:

};

#endif // PAINTAREA_H

paintarea.cpp

#include "paintarea.h"
#include "ui_mainwindow.h"

PaintArea::PaintArea(QWidget *parent) :
    QWidget(parent)
{
}

void PaintArea::rysuj(QPaintEvent *event)
{
    QPainter painter (this);
    painter.drawLine(20,20,4000,4000);
    painter.drawEllipse(100,100,50,50);
}

main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
0

A kiedy zostaje wywołana funkcja rysuj? Gdy trzeba odmalować komponent wywoływana jest funkcja paintEvent i ona odpowiada za rysowanie.
Zerknij też na to:
http://doc.trolltech.com/4.7-snapshot/painting-basicdrawing.html

0

Dzięki;) Myślałem że nazwa funkcji może być dowolna tylko argument musi być QPaintEvent. Teraz chodzi wszystko:)

Napotkałem niestety kolejny problem:( Nie potrafię przypisać wartości zmiennej z jednej klasy za pomocą funkcji która należy od innej klasy.
Przykładowy program:

klasa1.h

#ifndef KLASA1_H
#define KLASA1_H

class klasa1
{
public:
    int zmienna ;
    klasa1();
};

#endif // KLASA1_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <klasa1.h>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void funkcja(int a);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "klasa1.h"

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

}

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

void MainWindow::funkcja(int a)
{
    a = klasa1::zmienna;
}

Dostaję błąd object missing in reference to klasa1::zmienna

0

@konrad147 przykro mi, ale nie czas dla ciebie na zabawę Qt skoro nie umiesz podstaw obiektowości.

  1. Gdzie masz definicję konstruktora klasy klasa1?
  2. Czemu wszystko w tej klasie jest publiczne?!
  3. Nigdzie nie stworzyłeś obiektu tej klasy, więc jak chcesz sie odnosić do niego? Co to niby znaczy:
klasa1::zmienna;

skoro ta zmienna nie jest statyczna (czyli nie przynalezy do klasy jako takiej)?

0
konrad147 napisał(a)
void MainWindow::funkcja(int a)
{
    a = klasa1::zmienna;
}

No i warto zauważyć, że nawet jeśli zrobiłby zmienną statyczną to ów przypisanie nie ma sensu gdyż przypisuje wartość do zmiennej lokalnej, której wartość nigdy nie wyjdzie na zewnątrz, więc ta metoda w zasadzie nic nie robi

edit:
i co to jest

#include <klasa1.h> 

w pliku nagłówkowym
oraz

#include "klasa1.h"

w źródłowym?
po co dwa razy załączasz i to jeszcze w taki sposób?
Widzę, że kolega nie tylko nie ma podstaw obiektowości ale i również samego języka.

0

Przepraszam, ale trochę się wczoraj spieszyłem i źle opisałem swój problem ;/ Program którego kod wysłałem jest utworzony tylko w celu opisania mojego problemu i nie ma on nic robić ;)
Zmieniłem trochę program, chodzi mi o to że nie mogę zmieniać nic w kontrolkach funkcjami z klas innych niż MainWindow. Nie chodzi o to że nie tworzę obiektu na którym taka funkcja miałaby być wywołana, ponieważ kompilator krzyczy już przy definicji takiej funkcji:( Poniżej zamieszczam kod:

klasa1.h

#ifndef KLASA1_H
#define KLASA1_H

class klasa1
{
public:
    void napisz() ;
    klasa1();
};

#endif // KLASA1_H

klasa1.cpp - co to tego gdzie był konstruktor tej klasy to był on właśnie w tym pliku, ale był on pusty, więc nie wklejałem go we wcześniejszym poście.

#include "klasa1.h"
#include "ui_mainwindow.h"

klasa1::klasa1()
{
}

void klasa1::napisz()
{
    Ui_MainWindow::label->setText("Program");  // Tu jest cały problem
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

}

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

Używam QtCreator, więc nie mam dostępu do pliku ui_mainwindow.

0

Ale o co ci w ogóle chodzi? Robisz dokładnie ten sam błąd o którym pisałem wyżej. Co to wg ciebie jest

Ui_MainWindow::label

?
Przecież to nie są żadne pola statyczne! Masz w programie wskaźnik ui za pomocą którego masz sie odnosić do tego co masz na formie. Żeby to robić musisz go przekazać do obiektu swojej klasy! Przecież mógłbyś mieć tam dwa okienka i jak wtedy niby byś wybierał w którym oknie chcesz cos zmienić? o_O Musisz wskazać konkretne okno!
Konkludując: przekaż choćby w konstruktorze do obiektu swojej klasy wskaźnik

Ui::MainWindow *ui;
0

W jaki sposób chcesz wykorzystać klasę nie tworząc jej obiektu ( pomijam pola statyczne )?

0

Chodzi mi o to, że jak mam jaką funkcję czy slot w klasie MainWindow to w niej mam dostęp do formy po prostu przez ui->nazwa_obiektu. Ale nie wiem jak mieć dostęp do tego obiektu z innej klasy.

0

Ale której części mojej wypowiedzi nie rozumiesz? Przekaż wskaźnik ui do obiektu w którym chcesz mieć ten dostęp. Nie ma innej rady. Jeśli nie rozumiesz o co mi chodzi to zwyczajnie odstaw Qt i naucz się podstaw obiektowości w C++.

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