2012-06-10 16 views
11

Sto provando a disegnare forme base su un QGLWidget. Sto cercando di abilitare l'antialias per smussare le linee, ma non funziona.Quali passaggi sono necessari per abilitare l'antialias quando si utilizza QPainter su un QGLWidget?

Questo è quello che sto provando in questo momento:

QGLWidget *widget = ui->renderWidget; 

QPainter painter; 

widget->makeCurrent(); 
glEnable(GL_MULTISAMPLE); 
glEnable(GL_LINE_SMOOTH); 

painter.setRenderHint(QPainter::Antialiasing); 
painter.setRenderHint(QPainter::HighQualityAntialiasing); 

painter.begin(widget); 

Tuttavia, nulla disegnato con questo pittore ha ancora i bordi frastagliati. Cos'altro devo fare?

+0

Il sistema supporta i framebuffer multisample? – cmannett85

+0

Sì, è Windows 7 e l'ho fatto funzionare su un altro progetto Qt che usava QGLWidget senza QPainter, semplicemente abilitando GL_MULTISAMPLE. – Elliott

+0

Il fatto che sia Windows 7 è irrilevante, dipende dal fatto che la GPU e i driver li supportino o meno, ma se un altro progetto sulla stessa macchina_ ha funzionato correttamente, deve essere OK. Il tuo esempio sembra suggerire che stai cercando di disegnare sul widget al di fuori di un 'paintEvent (evento QPaintEvent *)', o è solo confondere lo pseudo-codice !? – cmannett85

risposta

10

ho trovato la soluzione. Durante il debug di un altro problema, ho trovato i messaggi nel mio output di debug in modo che non sia possibile impostare i rendering prima della chiamata a begin().

le seguenti opere:

QGLWidget *widget = ui->renderWidget; 

QPainter painter; 

widget->makeCurrent(); 
glEnable(GL_MULTISAMPLE); 
glEnable(GL_LINE_SMOOTH); 

painter.begin(widget); 

painter.setRenderHint(QPainter::Antialiasing); 
painter.setRenderHint(QPainter::HighQualityAntialiasing); 
7

Si può cercare di attivare l'antialiasing sul Widget completo:

QGLWidget::setFormat(QGLFormat(QGL::SampleBuffers));

+0

Semplice, non invasivo e funziona perfettamente! – BenC

+1

Funziona perfettamente. Nota, hai ancora bisogno di 'setRenderHint (QPainter :: Antialiasing)'. – Timmmm

0

Questa domanda è piuttosto vecchio, ma ho ancora trovato su Google. Non si dovrebbe usare più QGLWidget. Utilizzare il più recente QOpenGLWidget. Ciò rende la scena fuori dallo schermo piuttosto che creare una finestra OpenGL nativa che causa tutti i tipi di problemi con il ridimensionamento dei layout. Questo codice funziona per me. Inseriscilo nel costruttore QGraphicsView:

QOpenGLWidget* gl = new QOpenGLWidget; 
QSurfaceFormat fmt; 
fmt.setSamples(8); 
gl->setFormat(fmt); 
setViewport(gl); 
setRenderHint(QPainter::Antialiasing); 
Problemi correlati