Qt QPixmap i markery

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

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ć.

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);
}
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: Paint device returned engine == 0, type: 1
QPainter: Painter not active
QPainter: Painter not active
QPainter: Painter not active

w czym moze byc problem?

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

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

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)
0

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

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?:

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

dobra juz sie sprawa rozwiazala, trzeba zjadlem jedno =

0

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

if(px && flag_grid)

też da radę ;)

0

IMHO za bardzo kombinujecie! Rozszerzanie QLabel by rysować jakieś markery to dla mnie wielkie WTF.
Stworzyłbym nowego widget'a rysującego tylko te markery a następnie umieściłbym ten widget nad QLabel z pixmap. Najlepiej jeśli oba znalazły by się w QStackedLayout.

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