1

QStackedWidget に格納されている 2 つの QGLWidget を使用して、Qt で画像視覚化アプリケーションを開発しました。考慮されている 2 つの画像の違いを見つけるために、各 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);

このちらつきを取り除く方法を知っている人はいますか?

4

0 に答える 0