我使用存储在 QStackedWidget 中的两个 QGLWidget 在 Qt 中开发了一个图像可视化应用程序。我希望能够依次快速显示每个 QGLWidget,以便发现所考虑的两个图像中的差异。为此,我将wheelEvent()
函数映射到setCurrentIndex()
QStackedWidget 的。
我的问题是,当快速触发该wheelEvent()
功能时,这不时会导致白色闪烁,这会干扰图像分析任务。就像在显示 QGLWidget 之前显示某些小部件的默认背景一样,但我一直无法找到哪个...
我在 VisualStudio 2008 中使用 C++ 和 Qt 4.7,问题出现在 Windows XP 和 Windows 7 上。
以下是重现问题的最小代码:
#include <QtGUI/QApplication>
#include <QtGUI/QMainWindow>
#include <QtGUI/QStackedWidget>
#include <QtOpenGL/QGLWidget>
// Class for the QGLWidgets
class GLWidget : public QGLWidget
{
public:
int _id;
// Constructor
GLWidget(int id, QWidget *parent) :
QGLWidget(parent),
_id(id)
{
};
// OpenGL initialization
void initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);// Black Background
glClearDepth(1.0f); // Depth Buffer Setup
};
// Paint in OpenGL viewport
void paintGL()
{
// Clear Screen And Depth Buffer, and adapt viewport to widget geometry
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0,0,geometry().width(),geometry().height());
// Define projection matrix
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,1,0,1,-1,1);
// Draw rectangle
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor4f((_id?0:1),0,(_id?1:0),1.0f);
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
glFrontFace(GL_CW);
glBegin(GL_QUADS);
glVertex3f(0.33,0.33,0);
glVertex3f(0.33,0.66,0);
glVertex3f(0.66,0.66,0);
glVertex3f(0.66,0.33,0);
glEnd();
};
};
// Class for the main window
class MainWindow : public QMainWindow
{
public:
QStackedWidget* _stack;
GLWidget* _w1;
GLWidget* _w2;
// Constructor
MainWindow(QWidget * parent = 0, Qt::WindowFlags flags = 0) :
QMainWindow(parent,flags),
_stack(NULL),
_w1(NULL),
_w2(NULL)
{
_stack = new QStackedWidget(this);
_w1 = new GLWidget(0,_stack);
_w2 = new GLWidget(1,_stack);
_stack->addWidget(_w1);
_stack->addWidget(_w2);
setCentralWidget(_stack);
};
protected:
// Mouse wheel event switches between two GL widgets
void wheelEvent(QWheelEvent* event)
{
_stack->setCurrentIndex(1-_stack->currentIndex());
};
};
// Main function
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.connect( &app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()) );
MainWindow mw;
mw.show();
return app.exec();
}
我尝试使用下面的代码将所有涉及的小部件的背景颜色设置为黑色(包括 QMainWindow),但仍然出现白色闪烁。
setAutoFillBackground(true);
QPalette pal = palette();
pal.setColor(QPalette::Window,Qt::black);
setPalette(pal);
有谁知道如何消除这种闪烁?