Qt QPixmap i markery

Odpowiedz Nowy wątek
janek89
2011-05-27 23:35
janek89
0

hej,

pisze wlasnie aplikacje w ktorej mam labela w ktrorym wyswietlam jakas QPixmape. Chcialbym aby po nacisnieciu jakiegos przycisku na tej pixmapie pojawily mi sie 4 linie (markery) tak abym mogl sobie zaznaczyc jakies dlugosci, ale te linie musze przesuwac wiec musza byc one tak jakby nad tym calym moim obrazkiem (QPixmapą). Da się to zrobić? i czy ewentualnie moglby mi ktos dac jakies wskazowki jak to ugryzc. Z gory dzieki

Pozostało 580 znaków

2011-05-28 01:26

Rejestracja: 14 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Warszawa

1

Skoro to ma zostać QLabel,to trzeba będzie reimplementować paintEvent() rysując sobie linie.I o ile dobrze odgadłem,będziesz chciał mieć 2 markery pionowe i 2 poziome-dla nich musisz przechowywać wartość x1 i x2 oraz y1 i y2.Przesuw marketów zrealizujesz poprzez reimplementację mouseMoveEvent,badając czy położenie wskaźnika myszy+jakiś offset (bo nie chcesz chyba celować co do pixela ;]) pasuje do z zapamiętanych którejś wartości,po czym odpowiednio ją modyfikować.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

janek89
2011-05-28 15:06
janek89
1

tak dobrze odgadles 2 markery pionowe i 2 poziome, moglbys mi pokazac jakis przyklad jak na takim labelu cos narysowac?? ja mam tego QLabela w stworzonym przez siebie widgecie i caly label jest czarny ;/ a to co wywolam do narysowania w paintevencie rysuje sie pod labelem a nie w labelu

moj widget:

FrameWidget::FrameWidget(QWidget *parent) :
    QWidget(parent)
{

    //tworzenie layoutu oraz umieszczenie w nim labela
    layout = new QVBoxLayout;
    label = new QLabel;
    layout->setContentsMargins(10,10,10,10);
    layout->addWidget(label);

    QImage temp(640,480,QImage::Format_RGB32);
    frame = temp;       

    //Przeksztalcenie QImagea do QPixmapy i wyswietlenie go w labelu
    QPixmap obraz = QPixmap::fromImage(frame);
    label->setPixmap(obraz);

    setLayout(layout);
}

void FrameWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);     //// tutaj jest pewnie blad bo this odwoluje sie do widgeta a nie do labela, ale co tu wpisac zeby rysowalo sie wszystko na labelu (samo "label" nie dziala)
    painter.setPen(QPen(Qt::black, 12, Qt::SolidLine, Qt::RoundCap));
    painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
    painter.drawRect(0,0, 300, 300);
}
edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

janek89
2011-05-28 15:23
janek89
0
void FrameWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(label);     
    painter.setPen(QPen(Qt::black, 12, Qt::SolidLine, Qt::RoundCap));
    painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
    painter.drawRect(0,0, 300, 300);
}

jak wpisze label to wyswietla mi sie cos takiego:
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
QPainter::drawRects: Painter not active

w czym moze byc problem?

Pozostało 580 znaków

2011-05-28 16:31

Rejestracja: 14 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Warszawa

1

W złej inicjalizacji qpaintera.Nie tak się go tworzy
Cóż,dla przykładu powiadasz Bracie...okay,oto jak narysować same markery:

yourLabel::paintEvent(QPaintEvent *e)
{
//najpierw niech QLabel maluje domyślne rzeczy
    QLabel::paintEvent(e);

//teraz namalowane zostaną 4 markery na pixmapie
    const QPixmap *px=pixmap();
    if(px)
    {
#define OFFSET 10

         //główna ma idea jest taka,żeby malowało markery tuż przy krawędziach pixmapy
         int pxWidth=px.width();
         int pxHeight=px.height();         

         QPainter p(this);
         p.setPen(QPen(Qt::red,2,Qt::DashDotLine));//powiedzmy,że chce się markery czerwone o stylu dash-dot i grubości 2

         //rysowanie markerów pionowych
         p.drawLine(0+OFFSET,0,0+OFFSET,pxHeight);//lewy
         p.drawLine(pxWidth-OFFSET,0,pxWidth-OFFSET,pxHeight);//prawy

         //markery poziome
         p.drawLine(0,0+OFFSET,pxWidth,0+OFFSET);//górny
         p.drawLine(0,pxHeight-OFFSET,pxWidth,pxHeight-OFFSET);//dolny
    }
#undef OFFSET
}

to tak tylko podglądowo-statyczne markery.Jak mówiłem wcześniej,żeby dało się nimi ruszać musisz pobawić się mouseMoveEventem,i w nim przestawiać punkty do narysowania linii.Ponadto musisz mieć świadomość,że trzeba też uwzględnić sytuację zmieniania rozmiaru przez siedzący w layoucie QLabel


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-05-28 16:34

Pozostało 580 znaków

janek89
2011-05-28 17:17
janek89
0

sory ale nie rozumiem jeszcze tego poczatku:


yourLabel::paintEvent(QPaintEvent *e)    //czy chodzi tu o to zeby wstawic: void FrameWidget::paintEvent(QPaintEvent *e)
{
//najpierw niech QLabel maluje domyślne rzeczy
    QLabel::paintEvent(e);                    // moj QLabel w tej klasie nazywa sie po prostu "label" ale chyba nie moge tego zapisac tak: label::paintEvent(e);

    //teraz namalowane zostaną 4 markery na pixmapie
    const QPixmap *px=pixmap();     // funkcja pixmap() zwraca wskaznik do jakiejs QPixmapy tylko jakiej?
    if(px)
}

Sory za glupie pytania ale nie za bardzo to czaje

Pozostało 580 znaków

janek89
2011-05-28 21:18
janek89
0

dobra juz wiem ze yourLabel to podklasa ktora musialem utworzyc, i w tej klasie zaimplementowalem funkcje


void myLabel::paintEvent(QPaintEvent *e){

}

ale dalej nie wiem o co chodzi w tym dalszym kodzie:

//najpierw niech QLabel maluje domyślne rzeczy
    QLabel::paintEvent(e);    

//teraz namalowane zostaną 4 markery na pixmapie
    const QPixmap *px=pixmap();
    if(px)

Pozostało 580 znaków

janek89
2011-05-28 21:54
janek89
0

MasterBLB juz wszystko zrozumialem, wielkie dzieki za pomoc, jestes genialny :)

to cyknij ptaszka przy poście który uznałeś za pomocny,coby zaznaczyć rozwiązany problem ;) - MasterBLB 2011-05-29 01:08

Pozostało 580 znaków

janek89
2011-05-29 16:50
janek89
0
MasterBLB napisał(a)

W złej inicjalizacji qpaintera.Nie tak się go tworzy
Cóż,dla przykładu powiadasz Bracie...okay,oto jak narysować same markery:


yourLabel::paintEvent(QPaintEvent *e)
{
//najpierw niech QLabel maluje domyślne rzeczy
QLabel::paintEvent(e);

//teraz namalowane zostaną 4 markery na pixmapie
const QPixmap *px=pixmap();
if(px)
{
#define OFFSET 10

     //główna ma idea jest taka,żeby malowało markery tuż przy krawędziach pixmapy
     int pxWidth=px.width();
     int pxHeight=px.height();         

     QPainter p(this);
     p.setPen(QPen(Qt::red,2,Qt::DashDotLine));//powiedzmy,że chce się markery czerwone o stylu dash-dot i grubości 2

     //rysowanie markerów pionowych
     p.drawLine(0+OFFSET,0,0+OFFSET,pxHeight);//lewy
     p.drawLine(pxWidth-OFFSET,0,pxWidth-OFFSET,pxHeight);//prawy

     //markery poziome
     p.drawLine(0,0+OFFSET,pxWidth,0+OFFSET);//górny
     p.drawLine(0,pxHeight-OFFSET,pxWidth,pxHeight-OFFSET);//dolny
}

#undef OFFSET
}

> to tak tylko podglądowo-statyczne markery.Jak mówiłem wcześniej,żeby dało się nimi ruszać musisz pobawić się mouseMoveEventem,i w nim przestawiać punkty do narysowania linii.Ponadto musisz mieć świadomość,że trzeba też uwzględnić sytuację zmieniania rozmiaru przez siedzący w layoucie QLabel

jeszcze takie pytanie, bo chcialbym zeby mi sie te markery pokazywaly wtedy gdy bool flag_grid = true, ale jak zrobie cos takiego to to nie dziala, dlaczego?:
```cpp
yourLabel::paintEvent(QPaintEvent *e)
{
//najpierw niech QLabel maluje domyślne rzeczy
    QLabel::paintEvent(e);

flag_grid=false;

//teraz namalowane zostaną 4 markery na pixmapie
    const QPixmap *px=pixmap();
    if(px)
    {
     if (flag_grid =true){  // t
#define OFFSET 10

         //główna ma idea jest taka,żeby malowało markery tuż przy krawędziach pixmapy
         int pxWidth=px.width();
         int pxHeight=px.height();         

         QPainter p(this);
         p.setPen(QPen(Qt::red,2,Qt::DashDotLine));//powiedzmy,że chce się markery czerwone o stylu dash-dot i grubości 2

         //rysowanie markerów pionowych
         p.drawLine(0+OFFSET,0,0+OFFSET,pxHeight);//lewy
         p.drawLine(pxWidth-OFFSET,0,pxWidth-OFFSET,pxHeight);//prawy

         //markery poziome
         p.drawLine(0,0+OFFSET,pxWidth,0+OFFSET);//górny
         p.drawLine(0,pxHeight-OFFSET,pxWidth,pxHeight-OFFSET);//dolny
    }
#undef OFFSET
}
}

Pozostało 580 znaków

janek89
2011-05-29 16:52
janek89
0

dobra juz sie sprawa rozwiazala, trzeba zjadlem jedno =

Pozostało 580 znaków

2011-05-29 19:17

Rejestracja: 14 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Warszawa

0

Nie ma potrzeby ifów zagnieżdżać.

if(px && flag_grid)

też da radę ;)


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 2x, ostatnio: MasterBLB, 2011-05-29 19:22

Pozostało 580 znaków

Odpowiedz

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