2012-06-10 4 views
11

J'essaye de dessiner des formes basiques sur un QGLWidget. J'essaie d'activer l'antialiasing pour lisser les lignes, mais ça ne marche pas.Quelles sont les étapes nécessaires pour activer l'antialiasing lors de l'utilisation d'un QPainter sur un QGLWidget?

C'est ce que je suis en train au moment:

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

Cependant, quoi que ce soit dessiné avec ce peintre a encore des bords déchiquetés. Quoi d'autre dois-je faire?

+0

Votre système prend-il en charge les tampons d'images multi-échantillons? – cmannett85

+0

Oui, c'est Windows 7, et je l'ai eu pour travailler sur un autre projet Qt qui utilisait QGLWidget sans QPainter, en activant simplement GL_MULTISAMPLE. – Elliott

+0

Le fait que ce soit Windows 7 n'est pas pertinent, c'est si votre GPU et les pilotes les supportent - mais si un autre projet sur la même machine fonctionnait correctement alors ça doit être OK. Votre exemple semble suggérer que vous essayez de dessiner sur le widget en dehors d'un paintEvent (événement QPaintEvent *), ou est-ce juste un pseudo-code? – cmannett85

Répondre

10

J'ai trouvé la solution. Lors du débogage d'un problème différent, j'ai trouvé des messages dans ma sortie de débogage à l'effet que vous ne pouvez pas définir les rendus avant l'appel à begin().

Les travaux suivants:

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

Vous pouvez essayer d'activer l'antialiasing sur le Widget complet:

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

+0

Simple, non invasive et fonctionne parfaitement! – BenC

+1

Fonctionne parfaitement. Notez que vous avez toujours besoin de 'setRenderHint (QPainter :: Antialiasing)'. – Timmmm

0

Cette question est assez vieux, mais je trouve encore sur Google. Vous ne devriez plus utiliser QGLWidget. Utilisez le plus récent QOpenGLWidget. Cela rend la scène hors écran plutôt que de créer une fenêtre OpenGL native qui provoque toutes sortes de problèmes avec les mises en page de redimensionnement. Ce code fonctionne pour moi. Placez-le dans votre constructeur QGraphicsView:

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