2012-06-10 11 views
11

Próbuję narysować podstawowe kształty na QGLWidget. Próbuję włączyć wygładzanie krawędzi w celu wygładzenia linii, ale to nie działa.Jakie kroki są konieczne, aby włączyć wygładzanie krawędzi podczas używania QPaintera na QGLWidget?

To co próbuję w tej chwili:

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

Jednak coś wyciągnąć z tego malarza nadal ma postrzępione krawędzie. Co jeszcze muszę zrobić?

+0

robi swoje poparcie System Multisample bufora ramki? – cmannett85

+0

Tak, to jest Windows 7, i dostałem go do pracy nad innym projektem Qt, który używał QGLWidget bez QPaintera, włączając tylko GL_MULTISAMPLE. – Elliott

+0

Fakt, że jest to Windows 7, jest nieistotny, zależy od tego, czy GPU i sterowniki je obsługują - ale jeśli inny projekt _ na tym samym komputerze_ działał poprawnie, to musi być OK. Twój przykład wydaje się sugerować, że próbujesz narysować na widżecie poza zdarzeniem 'paintEvent (QPaintEvent *) lub czy jest to po prostu mylące pseudo-kod !? – cmannett85

Odpowiedz

10

znalazłem rozwiązanie. Podczas debugowania innego problemu znalazłem komunikaty w wynikach debugowania, że ​​nie można ustawić renderów przed wywołaniem().

następujące utwory:

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

Można spróbować włączyć antyaliasing w sprawie kompletnego Widget:

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

+0

Proste, nieinwazyjne i działa idealnie! – BenC

+1

Działa idealnie. Uwaga, nadal potrzebujesz 'setRenderHint (QPainter :: Antialiasing)'. – Timmmm

0

to pytanie jest dość stary, ale wciąż nie znaleziono go w Google. Nie powinieneś więcej używać QGLWidget. Użyj nowszego QOpenGLWidget. Spowoduje to renderowanie sceny poza ekranem, zamiast tworzenia natywnego okna OpenGL, co powoduje różnego rodzaju problemy z zmienianiem układu. Ten kod działa dla mnie. Umieścić go w konstruktorze QGraphicsView:

QOpenGLWidget* gl = new QOpenGLWidget; 
QSurfaceFormat fmt; 
fmt.setSamples(8); 
gl->setFormat(fmt); 
setViewport(gl); 
setRenderHint(QPainter::Antialiasing); 
Powiązane problemy