Я пытаюсь реализовать простой MVC в QT. Цель состоит в том, чтобы иметь один виджет рендеринга, модель и контроллер. Контроллер будет абстрактным базовым классом с методом "рендеринга", поэтому каждый контроллер знает, как рисовать его модель, чтобы что-то рисовать. Я создал очень простой пример того, что я пытаюсь выполнить, но при отладке сразу появляется следующая ошибка:
Внутренняя ошибка: pc 0x0 в read в psymtab, но не в symtab.
Я убрал столько, сколько мог, чтобы воспроизвести ошибку. Несмотря на то, что код запускается и выходит с тем, что показано ниже, попытка создания RenderWidget приведет к нескольким ошибкам, включая сбой сегментации (в режиме отладки).
Любая помощь будет оценена по достоинству. Я включил минимальный код, необходимый для воспроизведения этой ошибки ниже. Это было сделано в пустом проекте QT Widget без форм.
Я потратил еще немного времени на борьбу с этой ошибкой, и я сузил ее дальше. Я еще больше подрезал код и переместил его в один файл Main.cpp, согласно предложению Митча. Ошибка появляется, если вы поместите контрольную точку в метод Main и перейдите в конструктор MainWindow.
#include <QApplication>
#include <QWidget>
#include <QMainWindow>
class RenderWidget : public QWidget
{
Q_OBJECT
public:
explicit RenderWidget(QWidget *parent = 0);
};
RenderWidget::RenderWidget(QWidget *parent) :
QWidget(parent)
{
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
RenderWidget* m_renderArea;
};
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
m_renderArea = new RenderWidget(this);
}
MainWindow::~MainWindow()
{
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
#include "main.moc"
Похоже, проблема была либо ошибкой с версией QT, которую я установил, либо с отладчиком, который я использовал. Проблема возникла, даже если я создал новый проект. После установки QT 5.3 и получения самой новой версии средств отладки для Windows ошибка, похоже, исчезла.
Вы должны удалить или реализовать свой конструктор в контроллере:
//Controller();
или
Controller() {}
Кроме того, в ControllerA
вы также должны вызвать базовый класс:
ControllerA::ControllerA()
: Controller()
{
}
Наконец, ui_renderArea
не инициализируется.
#include "main.moc"
внизу файла. Это сделало бы других пользователей гораздо более склонными опробовать ваш код.