2

私は Qt の初心者で、QGLWidget とその他の UI コントロールを使用して Qt アプリを作成しようとしています。起動後しばらくするとクラッシュします。

以下は、問題を再現する手順です。

Mac 上の Qt 5.0.1。

  1. QTCreator を開きます。QMainWindow クラスに基づいて新しいプロジェクトを作成します。
  2. opengl を .pro ファイルに追加します。

    QT       += core gui opengl
    
  3. QGLWidget から継承された単純な GLWidget クラスを作成します (何もしません)。

    #pragma once
    
    #include <QGLWidget>
    
    class GLWidget : public QGLWidget 
    {
        Q_OBJECT
    public:
        GLWidget() {};
    };
    
  4. デザイナーでいくつかのことを行います。

    • メイン ウィンドウに 3 つの垂直レイアウトを配置します。
    • それらを垂直スプリッターで整理します。
    • CentralWidget レイアウトを水平に設定します。 QTクリエーターのスクリーンショット
    • ウィンドウに GLWidget を追加する mainwindow.cpp コードの MainWindow コンストラクターに配置します。

      ui->verticalLayout_2->addWidget(new GLWidget);
      
  5. 走る。わかった! アプリのスクリーンショット

  6. QTreeView ウィジェットをデザイナーの左側のレイアウトにドロップします。

  7. もう一度実行...クラッシュ!

    0   __pthread_kill          0x7fff83e5d212  
    1   pthread_kill            0x7fff8b77caf4  
    2   abort           0x7fff8b7c0dce  
    3   qt_message_fatal    qlogging.cpp    868 0x101711a88 
    4   QMessageLogger::fatal   qlogging.cpp    356 0x1017122ae 
    5   qt_assert_x qglobal.cpp 1959    0x10170ba5a 
    6   QWidget::mapTo  qwidget.cpp 3866    0x10019dfb8 
    7   QFocusFramePrivate::updateSize  qfocusframe.cpp 95  0x1003b5785 
    8   QFocusFrame::eventFilter    qfocusframe.cpp 282 0x1003b6173 
    9   QCoreApplicationPrivate::sendThroughObjectEventFilters  qcoreapplication.cpp    863 0x10198103c 
    10  QApplicationPrivate::notify_helper  qapplication.cpp    3390    0x10015affb 
    11  QApplication::notify    qapplication.cpp    3359    0x10015fb49 
    12  QCoreApplication::notifyInternal    qcoreapplication.cpp    767 0x101980baf 
    13  QCoreApplication::sendSpontaneousEvent  qcoreapplication.h  206 0x10016329f 
    14  QWidgetWindow::handleResizeEvent    qwidgetwindow.cpp   448 0x1001e1ef5 
    15  QWidgetWindow::event    qwidgetwindow.cpp   160 0x1001e0e18 
    16  QApplicationPrivate::notify_helper  qapplication.cpp    3394    0x10015b025 
    17  QApplication::notify    qapplication.cpp    2825    0x10015cb3f 
    18  QCoreApplication::notifyInternal    qcoreapplication.cpp    767 0x101980baf 
    19  QCoreApplication::sendSpontaneousEvent  qcoreapplication.h  206 0x100dfc6ff 
    20  QGuiApplicationPrivate::processExposeEvent  qguiapplication.cpp 2169    0x100df8870 
    ... <More>              
    

これは QWidget::mapTo 関数でアサートされます:

    QPoint QWidget::mapTo(const QWidget * parent, const QPoint & pos) const
    {
        QPoint p = pos;
        if (parent) {
            const QWidget * w = this;
            while (w != parent) {
                Q_ASSERT_X(w, "QWidget::mapTo(const QWidget *parent, const QPoint &pos)",
                   "parent must be in parent hierarchy");
                p = w->mapToParent(p);
                w = w->parentWidget();
            }
        }
        return p;
    }

どうすればこれを回避できますか?

4

0 に答える 0