Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
| Autor | Správa |
|---|
Registrovaný: 21.07.07 Prihlásený: 11.01.13 Príspevky: 76 Témy: 42 | 42 |
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 |
|
Registrovaný: 11.01.09 Prihlásený: 25.04.26 Príspevky: 1399 Témy: 10 | 10 Bydlisko: Hrinova |
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
|
|
Registrovaný: 21.07.07 Prihlásený: 11.01.13 Príspevky: 76 Témy: 42 | 42 |
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 |
|
Registrovaný: 11.01.09 Prihlásený: 25.04.26 Príspevky: 1399 Témy: 10 | 10 Bydlisko: Hrinova |
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
|
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | 13 |
tusim sa da kreslit iba v QObject::QPaintEvent
_________________ Učet je neaktívny. |
|
Registrovaný: 21.07.07 Prihlásený: 11.01.13 Príspevky: 76 Témy: 42 | 42 |
Ďakujem vám, funguje to 
_________________ TUKE FEI Inteligentné systémy 3.ročník |
|
Registrovaný: 21.07.07 Prihlásený: 11.01.13 Príspevky: 76 Témy: 42 | 42 |
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 |
|
Registrovaný: 11.01.09 Prihlásený: 25.04.26 Príspevky: 1399 Témy: 10 | 10 Bydlisko: Hrinova |
Č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); }
|
|
Registrovaný: 21.07.07 Prihlásený: 11.01.13 Príspevky: 76 Témy: 42 | 42 |
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 |
|
Registrovaný: 11.01.09 Prihlásený: 25.04.26 Príspevky: 1399 Témy: 10 | 10 Bydlisko: Hrinova |
Prvky odoberaj takto:
Kód: for( int i = pListWid->count()-1; i >= 0; i-- ) { QListWidgetItem* listItem = pListWid->takeItem( i ); delete listItem;
}
|
|
Stránka: 1 z 1
| [ Príspevkov: 10 ] | |
|