[QT4] QPainter - jak rysować?

0

Witam!

Właśnie zabrałem się za QT4. Jeszcze nie do końca to załapałem, wydawałoby się banalną sprawę, rysowania (kiedyś liznąłem QT3, ale tam to jakoś łatwiej wyglądało). Stworzyłem sobie w QT Creator aplikację - zwykłe okienko + na niej dwie zakładki (QTabWidget w skład którego wchodzi tab i tab_2). Mam 3 pliki:

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;
}

i 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();
}

I teraz załóżmy, że chcę coś nabazgrać na tej drugiej zakładce. Gdzie powinienem wstawić kod, który by się tym zajął i jak powinien on wyglądać? Będę bardzo wdzięczny za jakiś prosty przykład.

z góry dzięki za pomoc
pozdrawiam
herszt

0

Przejrzałem zamieszczony przez Kolegę program i parę innych tutoriali. Na ich podstawie stworzyłem jeszcze raz projekt z dwoma nowymi plikami.

widget.h

#ifndef WIDGET_H
#define WIDGET_H

class Burning;

#include <QFrame>

class Widget : public QFrame
{
  Q_OBJECT

  public:
    Widget(QWidget *parent = 0);

  protected:
    void paintEvent(QPaintEvent *event);

  public:
    QWidget *m_parent;
    Burning *burn;

};

#endif

widget.cpp

#include "widget.h"
#include "burning.h"
#include <QPainter>
#include <QFrame>
#include <QHBoxLayout>
#include <QTextStream>

Widget::Widget(QWidget *parent)
    : QFrame(parent)
{
  m_parent = parent;
  setFrameShape(QFrame::StyledPanel);
  setFrameRect(QRect(0, 0, 400, 200));
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setPen(QColor("#d4d4d4"));
    painter.setPen(QColor(255, 255, 184));
    painter.setBrush(QColor(255, 255, 184));
    painter.drawRect(0, 0, 400, 100);
    QFrame::paintEvent(event);
}

mój nowy plik który stanowi 'bazę' aplikacji nazywa się burning.cpp:

#include "burning.h"
#include "ui_burning.h"
#include <QApplication>
#include <QPainter>
#include <QVBoxLayout>
#include <QFrame>

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

    QHBoxLayout *hbox = new QHBoxLayout();

    widget = new Widget(this);
    hbox->addWidget(widget, 0);

}

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

Mam z tym kodem kilka problemów. Otóż - jak umieścić tego Widgeta w dowolnym miejscu? Bo póki co jest tylko w lewym górnym rogu. I jeszcze jedno - jak ustawić jego wielkość? Bo cokolwiek bym nie zmieniał jest zawsze jednej wielkości...

z góry dzięki za pomoc
pozdrawiam
herszt

0

OK. Już w miarę wiem w czym rzecz. Mam jeszcze jedno pytanko w kwestii klasy QPainter. A dokładniej QPainter::scale Mam taki kod:

    int side = qMin(width(), height());
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.scale(side / 256.0, side / 256.0);

Jest to fragment kodu w którym sobie rysuję jakiś obiekt. Umieszczony on jest potem w Horizontal Layout. I teraz szybkie pytanie w związku ze skalowaniem: otóż zastanawiam się czemu skalowanie ładnie działa z wartościami 256.0 a z innymi już nie bardzo. Co dokładnie zwraca width() i height() - w dokumentacji jest tylko krótka wzmianka, że wysokość i szerokość widgeta (ale tego co go tworzę, czy może Horizontal Layout w którym ten widget się znajduje). I co jeszcze mnie trochę zaskoczyło - dlaczego obserwuję różnicę w działaniu w zależności od tego czy w skalowaniu napiszę 256 czy 256.0? To nie powinno być to samo?

z góry dzięki
pozdrawiam
herszt

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