私は Qt の初心者で、QGLWidget とその他の UI コントロールを使用して Qt アプリを作成しようとしています。起動後しばらくするとクラッシュします。
以下は、問題を再現する手順です。
Mac 上の Qt 5.0.1。
- QTCreator を開きます。QMainWindow クラスに基づいて新しいプロジェクトを作成します。
opengl を .pro ファイルに追加します。
QT += core gui opengl
QGLWidget から継承された単純な GLWidget クラスを作成します (何もしません)。
#pragma once #include <QGLWidget> class GLWidget : public QGLWidget { Q_OBJECT public: GLWidget() {}; };
デザイナーでいくつかのことを行います。
- メイン ウィンドウに 3 つの垂直レイアウトを配置します。
- それらを垂直スプリッターで整理します。
- CentralWidget レイアウトを水平に設定します。
ウィンドウに GLWidget を追加する mainwindow.cpp コードの MainWindow コンストラクターに配置します。
ui->verticalLayout_2->addWidget(new GLWidget);
走る。わかった!
QTreeView ウィジェットをデザイナーの左側のレイアウトにドロップします。
もう一度実行...クラッシュ!
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;
}
どうすればこれを回避できますか?