View Full Version : [QT] Painting
pippofrank
14-11-2008, 18:29
Salve, sto trasformando una semplice applicazione facendo un porting da C# a QT. Ho creato un progetto QT che importa una UI creata con QTDesigner.
Ora il mio problema è il seguente: vorrei cliccando un pulsante che in un widget che ho inserito nella UI venisse disegnato qualcosa, anche un semplice punto, giusto per capire. Ho provato varie soluzioni, non ho errori di compilazione, ma non riesco a visualizzare nulla.
Sotto riporto il codice:
-----myqtapp.h-----
#include "ui_myqtapp.h"
class myQtApp : public QWidget, private Ui::myQtAppDLG
{
Q_OBJECT
public:
myQtApp(QWidget *parent = 0);
public slots:
void doSomething();
};
-----myqtapp.cpp--------
#include <QtGui>
#include "myqtapp.h"
myQtApp::myQtApp(QWidget *parent)
{
setupUi(this);
connect( btnCrea, SIGNAL( clicked() ), this, SLOT( doSomething() ) );
}
void myQtApp::doSomething()
{
// Qui dentro vorrei capire come fare per disegnare un punto dentro alla //widget della UI che ho chiamato "widget".
}
Se qualcuno mi potesse aiutare o darmi qualche dritta...
PS: utilizzo QT 4, quindi da quel che ho capito cè la novità arthur..
Grazie in anticipo..
Saluti
Devi usare QPainter.
http://doc.trolltech.com/4.4/qpainter.html
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
AnonimoVeneziano
14-11-2008, 19:28
Sinceramente non l'ho mai fatto,ma credo che sia necessario fare l'override della "paintEvent()" del widget in questione per disegnare quello che vuoi nel widget usando un oggetto QPainter
Ciao
pippofrank
18-11-2008, 21:02
Ciao, intanto grazie delle risposte,
ho provato a inserire il codice seguente, ma non riesco a richiamarlo e a visualizzare le modifiche..
Mi spiego, il mio widget è un widget che ho chiamato "Finestra" e sta all'interno della UI che ho creato col designer..
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
Qualcuno può mostrarmi qualcosa di più dettagliato o un semplice esempio??
grazie in anticipo ;-)
Paint Event è una funzione protected di QWidget.
Devi creare una sottoclasse di QWidget e reimplementare paintEvent.
class SimpleExampleWidget: public QWidget{
...............
void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(rect(), Qt::AlignCenter, "Qt");
}
.............};
SimpleExampleWidget non la puoi usare nel designer se non crei un plugin e ti consiglio di non farlo mai. Quindi ti conviene aggiungere SimpleExampleWidget al posto del widget che vuoi usare oppure dentro il widget che vuoi usare.
pippofrank
09-12-2008, 22:30
Salve,
grazie per le precedenti risposte. Sono riuscito finalmente a disegnare qualcosa dentro la ui.
Ora però ho un'altro problema.
All'avvio del programma, mi viene disegnato automaticamente quello che è contenuto nel metodo paintEvent (non capisco perchè), comunque, quello che vorrei fare è associare a un pulsante un evento di disegno attraverso la chiamata alla funzione doSomething(). Sembra che il connect (Che ho evidenziato in rosso) non faccia il suo lavoro e non riesco a capire come fare richiamare un evento di disegno dentro a quella funzione..
Qualcuno può darmi una mano?
grazie anticipatamente!!
riporto qui sotto il codice interessato:
#include <QtGui>
#include "test.h"
Test::Test(QWidget *parent)
: QWidget(parent)
{
setupUi(this);
m_drawer->installEventFilter(this);
connect(pushButton, SIGNAL( clicked()), this, SLOT( doSomething() ));
}
void Test::doSomething()
{
//vorrei in qualche modo qui dentro disegnare qualcosa di diverso da
quello che automaticamente mi disegna all'avvio.
}
bool Test::eventFilter(QObject *o, QEvent *e)
{
if (o == m_drawer && e->type() == QEvent::Paint) {
QPainter painter(m_drawer);
painter.setPen(Qt::blue);
painter.setFont(QFont("Arial", 30));
painter.drawText(m_drawer->rect(), Qt::AlignCenter, "Qt");
return true;
}
return QWidget::eventFilter(o, e);
}
void Test::paintEvent(QPaintEvent *event){
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 15, Qt::SolidLine, Qt::RoundCap,Qt::MiterJoin));
painter.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern));
painter.setPen(QPen(Qt::yellow, 5, Qt::SolidLine, Qt::RoundCap,Qt::MiterJoin));
painter.translate(100.0,100.0);
painter.drawPie(0, 0, 300, 300, 60 * 16, 270 * 16);
painter.drawEllipse(30,30,60,60);
}
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.