[ Príspevkov: 10 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 21.07.07
Prihlásený: 11.01.13
Príspevky: 76
Témy: 42 | 42
NapísalOffline : 22.11.2010 21:28 | QtCreator - vykreslovanie pixelov

zdravím, chcel by som sa spýtať, ako presne sa dá v QTCreator najjednoduchšie vykresliť 400 x 400 pixelov a zobraziť ich. Potrebujem ich vykresliť na základe výstupu z nejakého procesu. Potreboval by som inštrukcie pre všetky potrebné inicializácie, a hlavne príkaz na vykreslenie konkrétneho pixelu.

Moje pokusy boli nasledovné:
použil som QGraphicsView, v ktorom som načítal (setScene) QGraphicsScene, do ktorého som pridal QPixMap(addPixMap), do ktorého som načítal QImage(fromImage), do ktorého som predtým kreslil pomocou setPixel, ale
1. je to príliš zložité
, ale hlavne
2. nefunguje to

za odpoveď ďakujem.


_________________
TUKE FEI Inteligentné systémy 3.ročník
Offline

Skúsený užívateľ
Skúsený užívateľ
QtCreator - vykreslovanie pixelov

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 23.11.2010 12:22 | QtCreator - vykreslovanie pixelov

Ak sa jedná o obyčajné kreslenie pixelov, tak stačí kresliť na hlavný widget (prípadne akýkoľvek iný, ak hlavný nevyhovuje). Do hlavičkového súboru pridáme prototyp našej funkcie:
Kód:
protected:
    void paintEvent(QPaintEvent *);

A jej immplementáciu do cpp súboru:
Kód:
void DialogImpl::paintEvent( QPaintEvent * ) {

    QPainter painter(this);                // s touto triedou budeme vykonvat kreslenie
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
      
    painter.drawText( 50, 50, "My text..s" );     // vykresli text
            
    painter.drawLine( 100, 100, 150, 150 );     // ciara
      
    for ( int i = 0; i < 100; i++ )
        painter.drawPoint( 100 + i, 200 );     // pixel
      
}


// písal som to v qt4


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 21.07.07
Prihlásený: 11.01.13
Príspevky: 76
Témy: 42 | 42
Napísal autor témyOffline : 23.11.2010 14:59 | QtCreator - vykreslovanie pixelov

a prosím ťa, čo sa stane, ak to nedám do eventu, ale hocikde, napríklad do konštruktora . Alebo môžem modifikovať protected funkciu pre každý objekt zvlášť, alebo musím deklarovať odvodenú triedu. Ale nefunguje mi to ani s eventom, ani bez. Widget vykreslí, ale body, text a čiary nie.Niekde bude chyba. Asi sem hodím kód:

mainwindow.h:
Kód:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>

namespace Ui {
    class MainWindow;
}

class CPaintGraphicsView: public QGraphicsView
{
public:
    CPaintGraphicsView(QWidget * parent);
protected:
    void paintEvent(QPaintEvent *);
private:
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

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



private:
    Ui::MainWindow *ui;
    CPaintGraphicsView *pGraphicsView;
};

#endif // MAINWINDOW_H


mainwindow.cpp:
Kód:
#include "mainwindow.h"

CPaintGraphicsView::CPaintGraphicsView(QWidget * parent)
    :QGraphicsView(parent)
{

}

void CPaintGraphicsView::paintEvent( QPaintEvent * ) {

    QPainter painter(this);                // s touto triedou budeme vykonvat kreslenie
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));

    painter.drawText( 50, 50, "My text..s" );     // vykresli text

    painter.drawLine( 100, 100, 150, 150 );     // ciara

    for ( int i = 0; i < 100; i++ )
        painter.drawPoint( 100 + i, 200 );     // pixel

}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    pGraphicsView = new CPaintGraphicsView(this);
    pGraphicsView->resize(400, 400);
    resize(401,440);

}

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


main.cpp
Kód:
#include "mainwindow.h"

CPaintGraphicsView::CPaintGraphicsView(QWidget * parent)
    :QGraphicsView(parent)
{

}

void CPaintGraphicsView::paintEvent( QPaintEvent * ) {

    QPainter painter(this);                // s touto triedou budeme vykonvat kreslenie
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));

    painter.drawText( 50, 50, "My text..s" );     // vykresli text

    painter.drawLine( 100, 100, 150, 150 );     // ciara

    for ( int i = 0; i < 100; i++ )
        painter.drawPoint( 100 + i, 200 );     // pixel

}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    pGraphicsView = new CPaintGraphicsView(this);
    pGraphicsView->resize(400, 400);
    resize(401,440);

}

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


myslím si, že v tom kóde som urobil všetko tak, ako ste mi radili

za odpoveď ďakujem.


_________________
TUKE FEI Inteligentné systémy 3.ročník
Offline

Skúsený užívateľ
Skúsený užívateľ
QtCreator - vykreslovanie pixelov

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 23.11.2010 22:49 | QtCreator - vykreslovanie pixelov

Loko11 píše:
a prosím ťa, čo sa stane, ak to nedám do eventu, ale hocikde, napríklad do konštruktora

Nie som si istý, či to vôbec vykreslí, ale každopádne ak bude treba form prekresliť (napríklad po zmene veľkosti a pod), tak sa neprekreslí s pridanými funkciami, nakoľko konštruktor sa už volať nebude (logicky).

K tvojmu problému: skúšal som tvoj kód a popravde neviem prečo, ale na QGraphicsView sa nedá kresliť. Nedokázal som nájsť vysvetlenie ani na googli, takže neviem. Ak nie je nutné v tvojom prípade použiť tento widget, použi nejaký iný, napr, QFrame. Potom by kód vyzeral nasledovne:

main.cpp

Kód:
#include <QApplication>
#include "mainwindowimpl.h"
//
int main(int argc, char ** argv)
{
   QApplication app( argc, argv );
   MainWindowImpl win;
   win.show();
   app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
   return app.exec();
}


mainwindowimpl.cpp

Kód:
#include "mainwindowimpl.h"
//

SomeObject::SomeObject( QWidget *parent ) :
   QFrame (parent) {
   
}

void SomeObject::paintEvent( QPaintEvent * ) {
   
   QPainter painter(this);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 12));

    painter.drawText( 15, 15, "Tu sa da kreslit, je to novy widget" );
   
}




MainWindowImpl::MainWindowImpl( QWidget * parent, Qt::WFlags f)
   : QMainWindow(parent, f)
{
   setupUi(this);
   SomeObject* w = new SomeObject( this );
   w->setGeometry( 0, 0, 300, 50 );
   w->show();
   
}

//


void MainWindowImpl::paintEvent( QPaintEvent * ) {
   
   QPainter painter(this);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));

    painter.drawText( 50, 80, "Hlavny widget" );    
   
}



mainwindowimpl.h

Kód:
#ifndef MAINWINDOWIMPL_H
#define MAINWINDOWIMPL_H
//
#include <QMainWindow>
#include <QPainter>
#include <QtGui>
#include "ui_mainwindow.h"
//
class MainWindowImpl : public QMainWindow, public Ui::MainWindow
{
Q_OBJECT
public:
   MainWindowImpl( QWidget * parent = 0, Qt::WFlags f = 0 );
private slots:
protected:
   virtual void paintEvent( QPaintEvent * );
};


class SomeObject : public QFrame {
Q_OBJECT

public:
   SomeObject( QWidget *parent );
protected:
   virtual void paintEvent( QPaintEvent * );

};
   
#endif


Offline

Užívateľ
Užívateľ
QtCreator - vykreslovanie pixelov

Registrovaný: 16.02.08
Prihlásený: 08.12.10
Príspevky: 235
Témy: 13 | 13
NapísalOffline : 24.11.2010 16:32 | QtCreator - vykreslovanie pixelov

tusim sa da kreslit iba v QObject::QPaintEvent


_________________
Učet je neaktívny.
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 21.07.07
Prihlásený: 11.01.13
Príspevky: 76
Témy: 42 | 42
Napísal autor témyOffline : 05.01.2011 16:29 | QtCreator - vykreslovanie pixelov

Ďakujem vám, funguje to :)


_________________
TUKE FEI Inteligentné systémy 3.ročník
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 21.07.07
Prihlásený: 11.01.13
Príspevky: 76
Témy: 42 | 42
Napísal autor témyOffline : 08.01.2011 21:17 | QtCreator - vykreslovanie pixelov

zdravím, mam další problém s grafikou,
na vykresľovanie som tentoraz použil QGraphicsView a QGraphicsScene, pretože QFrame nemá funkciu mouseEvent.


mainwindow.h
Kód:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>

namespace Ui {
    class MainWindow;
}

class QTestView
    :public QGraphicsView
{
public:
    QTestView(QWidget * parent);
    void paintEvent(QPaintEvent *event);
private:
    QGraphicsScene *pScene;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QTestView *pView;
};

#endif // MAINWINDOW_H
}


mainwindow.cpp
Kód:
#include "mainwindow.h"
#include "ui_mainwindow.h"

QTestView::QTestView(QWidget * parent)
    :QGraphicsView(parent), pScene(new QGraphicsScene(this))
{
    setScene(pScene);
    setSceneRect(1, 1, 400, 400);
}

void QTestView::paintEvent(QPaintEvent *event)
{
    pScene->clear();
    QColor color(0, 0, 0);
    QPen pen(color);
    pen.setStyle(Qt::SolidLine);
    QBrush brush(color);
    pScene->addRect(5, 5, 200, 200, pen, brush);
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    pView = new QTestView(this);
    pView->setGeometry(10, 10, 402, 402);
}

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


main.h
Kód:
#include <QtGui/QApplication>
#include "mainwindow.h"

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

    return a.exec();
}


ten štvorec v paintEvent sa mi nevykreslí, neviem, čo mam robiť.
Neviete, prosím vás niekto, ako spraviť, aby to vykreslilo?
Za odpoveď ďakujem.


_________________
TUKE FEI Inteligentné systémy 3.ročník
Offline

Skúsený užívateľ
Skúsený užívateľ
QtCreator - vykreslovanie pixelov

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 08.01.2011 23:28 | QtCreator - vykreslovanie pixelov

Čo som prezeral dokumentáciu, tak tam nie je ani zmienka o kreslení cez paintEvent pre triedu QGraphicsView ( to vysvetľuje predchádzajúci problém, keď sme nemohli kresliť použitím paintEvent-u ) . Kreslenie tu funguje jednoducho tak, že čo nakreslíš na scénu, to sa okamžite zobrazí na QGraphicsView (samozrejme, ak je daná scéna pripojená ). Takže z tvojho kódu si odstráň celú metódu paintEvent (vrátane prototypu z hlavičkového súboru ) a jednoducho manipuluj so scénou. Napr ak si vytvoríš button, kde vytvoríš nový obdĺžnik, tak ten sa tam ihneď po kliknutí zobrazí.
Čiže po odstránení paintEvent-u daj všetko z neho trebárs do konštruktora triedy QTestView:

Kód:
QTestView::QTestView(QWidget * parent)
    :QGraphicsView(parent), pScene(new QGraphicsScene(this))
{

    pScene->clear();
    QColor color(0, 0, 0);
    QPen pen(color);
    pen.setStyle(Qt::SolidLine);
    QBrush brush(color);
    pScene->addRect(5, 5, 200, 200, pen, brush);

    setScene(pScene);
    setSceneRect(1, 1, 400, 400);
}


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 21.07.07
Prihlásený: 11.01.13
Príspevky: 76
Témy: 42 | 42
Napísal autor témyOffline : 27.02.2011 14:17 | QtCreator - vykreslovanie pixelov

zdravím, tato otázka sa nebude týkať grafiky, ale nechcel som zakladať novy thread pre Qt, takže:

mám kódy:

mainwindow.h
Kód:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QtGui/QListWidget>
#include <QtGui/QPushButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QListWidget *pListWid;
    QPushButton *pButtonDelete;

public slots:
    void DeleteSel();

};

#endif // MAINWINDOW_H


mainwindow.cpp
Kód:
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setGeometry(10, 40, 600, 600);
    pListWid = new QListWidget(this);
    pListWid->setSelectionMode(QAbstractItemView::ExtendedSelection);
    pListWid->setGeometry(10, 10, 300, 300);
    for(int i = 1; i <= 10; i++)
    {
        QString number;
        number.setNum(i);
        pListWid->addItem(QString("prvok c.").append(number));
    }
    pButtonDelete = new QPushButton(this);
    pButtonDelete->setGeometry(320, 10, 100, 25);
    connect(pButtonDelete, SIGNAL(clicked()), this, SLOT(DeleteSel()));
}

MainWindow::~MainWindow()
{
}

void MainWindow::DeleteSel()
{
    QList<QListWidgetItem *> items_to_delete = pListWid->selectedItems();
    for(QList<QListWidgetItem *>::Iterator iter = items_to_delete.begin(); iter != items_to_delete.end(); iter++)
    {
        pListWid->removeItemWidget(*iter);

    }
    pListWid->update();
    pListWid->repaint();
}


main.cpp:
Kód:
#include <QtGui/QApplication>
#include "mainwindow.h"

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

    return a.exec();
}


po stlačení buttonu by sa mali vymazať označené prvky QListWidget-u, no nevymažú sa.
Keď dám do for-cyklu v DeleteSel breakpoint, program zastane presne toľko krát, koľko prvkov bolo označených, čiže selectedItems() funguje pravdepodobne správne, takže chyba bude pravdepodobne v removeItemWidget(). Je to možno tým, že som do listu pridal prvky typu QString, čo sa dalo, ale removeItemWidget() je možno uspôsobený na vymazávanie QWidget-ov, čo je ale málo pravdepodobné, keďže pre QString vymazávanie v zozname funkcií nevidím.


_________________
TUKE FEI Inteligentné systémy 3.ročník
Offline

Skúsený užívateľ
Skúsený užívateľ
QtCreator - vykreslovanie pixelov

Registrovaný: 11.01.09
Prihlásený: 25.04.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 27.02.2011 23:40 | QtCreator - vykreslovanie pixelov

Prvky odoberaj takto:

Kód:
for( int i = pListWid->count()-1; i >= 0; i-- )
{
        QListWidgetItem* listItem = pListWid->takeItem( i );
        delete listItem;

}


 [ Príspevkov: 10 ] 


QtCreator - vykreslovanie pixelov



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

QtCreator : Segmentation fault

v Backend

1

423

27.12.2010 19:39

Forty-

V tomto fóre nie sú ďalšie neprečítané témy.

QtCreator - príkaz na respondovanie

v Backend

1

340

05.01.2011 17:44

Fico

V tomto fóre nie sú ďalšie neprečítané témy.

Chyba pixelov ?

v Monitory, televízory a projektory

1

423

04.02.2020 22:54

sp33d

V tomto fóre nie sú ďalšie neprečítané témy.

Oživenie vadných pixelov na LCD

v Monitory, televízory a projektory

11

1228

25.02.2011 12:56

TommyHot

V tomto fóre nie sú ďalšie neprečítané témy.

Pás pixelov na LCD monitore

v Monitory, televízory a projektory

5

1164

31.01.2008 14:57

OmeGa

V tomto fóre nie sú ďalšie neprečítané témy.

Pocet pixelov pre plagat A4

v Grafické programy

10

6013

20.04.2013 16:03

Seth Sparrow

V tomto fóre nie sú ďalšie neprečítané témy.

nastavenie pixelov v DIB pomocou Win32

v Backend

8

422

23.07.2012 11:20

Milos9304

V tomto fóre nie sú ďalšie neprečítané témy.

Samsung SyncMaster 245T - pruhy blikajúcich pixelov

v Monitory, televízory a projektory

0

471

03.05.2012 21:00

Malky

V tomto fóre nie sú ďalšie neprečítané témy.

vykreslovanie grafu

v Ostatné

6

968

27.08.2011 11:54

vama

V tomto fóre nie sú ďalšie neprečítané témy.

gts250 1gb vykreslovanie

v nVidia grafické karty

4

441

01.01.2011 9:47

marko13

V tomto fóre nie sú ďalšie neprečítané témy.

Vykreslovanie do Canvas

v Backend

4

380

13.04.2013 12:14

XOLOO

V tomto fóre nie sú ďalšie neprečítané témy.

[Delphi] vykreslovanie drahy

v Ostatné

9

948

16.02.2011 19:34

vama

V tomto fóre nie sú ďalšie neprečítané témy.

Pomale vykreslovanie Photoshop

v Grafické programy

4

629

12.11.2009 12:29

El_locco

V tomto fóre nie sú ďalšie neprečítané témy.

nahodne vykreslovanie - pascal

v Ostatné

16

1762

03.06.2007 22:38

juho

V tomto fóre nie sú ďalšie neprečítané témy.

C - vykreslovanie sikmych ciar

v Backend

8

713

29.05.2010 13:48

stopa27

V tomto fóre nie sú ďalšie neprečítané témy.

SVG vykreslovanie v cecku

v Backend

12

849

19.06.2011 17:52

ice-g



© 2005 - 2026 PCforum, edited by JanoF