Arhn - архитектура программирования

С++ Qt Ошибка сегментации при попытке доступа к методу объекта

Я изучаю Qt, и у меня возникла проблема. Мне нужна помощь, здесь, когда я пытался изменить переменные и отладить их, но не нашел решения. Я предоставлю некоторый код, чтобы понять проблему, с которой я столкнулся

В моем файле класса ColorButton.h

class ColorButton : public QToolButton
{
    Q_OBJECT
 public:
   explicit ColorButton(const QColor &color, QWidget *parent = 0);
   void testMethod();
};

Мой файл ColorButton.cpp выглядит так

ColorButton::ColorButton(const QColor &color, QWidget *parent)
{
    //some code
}

void ColorButton::testMethod()
{
   //This is
   //a test method
}

Я пытаюсь получить доступ к этому testMethod() из другого класса.

Из этого класса заголовочный файл Toolbar.h

class ToolBar : public QToolBar
{
    Q_OBJECT
public:
    explicit ToolBar(const QMap<ToolsEnum, QAction*> &actionMap, QWidget *parent = 0);

private:
    void setToolbar(); //initialize items
    ColorButton *test; //-----

public slots:
    void setMainColorView();
}

Файл Toolbar.cpp выглядит так

ToolBar::ToolBar(const QMap<ToolsEnum, QAction *> &actionMap, QWidget *parent) :
QToolBar(tr("Tools"),parent), actionMapVar(actionMap)
{
    setToolbar();
}

void ToolBar::setToolbar()
{
  test = new ColorButton(QColor("#8C001A"));
}

void ToolBar::setMainColorView()
{
 test->testMethod();
}
}

Программа работает, когда я помещаю test->testMethod(); в setToolbar() , но я хочу создать объект в setToolbar() и вызвать метод в setMainColorView().

До сих пор я пытался сделать общедоступной переменную кнопки Color, я также пытался инициализировать объект с именем test в конструкторе, но оба не работают.

Прямо сейчас с этим кодом я получаю сообщение об ошибке: «Нижестоящий остановился, потому что он получил сигнал от операционной системы. Имя сигнала: SIGSEGV Значение сигнала: Ошибка сегментации» со стрелкой, указывающей на test-> testMethod(). Я понятия не имею, как это решить, любая помощь будет оценена


  • Когда вызывается setMainColorView()? Вы уверены, что тест инициализирован в этот момент? Если вы используете Qt Creator, запустите отладчик с точками останова, где вы инициализируете тест и где вы его используете. сначала убедитесь, что он инициализирован, и когда он достигнет точки останова при его использовании, проверьте его, чтобы убедиться, что это допустимый объект. 10.12.2015
  • @Ninjammer setMainColorView() вызывается из другого класса. Я пытаюсь использовать существующий тестовый объект, созданный в setToolbar, вместо создания другого объекта. 10.12.2015
  • Я знаю, что вы пытаетесь сделать, и поэтому я предложил использовать отладчик с точками останова, чтобы вы могли проверить, что все происходит в том порядке, в котором вы ожидаете, и изучить объект, который вы пытаетесь использовать. Даже без точек останова, если вы запустите его через отладчик и он выдаст ошибку при использовании тестового объекта, вы сможете увидеть в этот момент, является ли тест нулевым или что-то в testMethod() идет не так. 10.12.2015
  • @Ninjammer понял, я проверю еще раз и вернусь к вам. 10.12.2015
  • @Ninjammer хорошо, я проверил, и программа работает в правильном порядке, пока я не пришел к test-›testMethod(); Вот где я получаю ошибку сегментации. Я пытаюсь получить доступ к тестовому объекту, который уже создан в setToolbar(), без передачи объекта в setMainColorView(). Например, есть ли способ сделать тестовый объект доступным для всех методов класса Toolbar. 10.12.2015
  • Это общедоступно, так и должно быть. Что отладчик говорит вам о тесте? имеет значение 0? Это означает, что во время выполнения с тестовым объектом что-то не так. Если бы проблема заключалась в том, что метод testMethod() был недоступен, вы бы обнаружили это во время компиляции. 10.12.2015
  • @Ninjammer Извините за поздний ответ, пока что я пробовал. Я переместил тест = новый ColorButton(QColor(#8C001A)); для setMainColorView(), и у меня все еще возникает та же проблема, я также добавил setMainColorView в файл заголовка, в приведенном выше коде я забыл добавить его раньше. 10.12.2015
  • @Ninjammer спасибо за вашу помощь. Мне жаль, что это была моя вина. Я все время смотрел не в то место. Я решил это, передав свой объект панели инструментов в класс, из которого я вызывал setMainColorView(). В этом классе я сделал локальную переменную объекта панели инструментов, присвоив ей это. И тогда это сработало. 10.12.2015

Ответы:


1

Я все время смотрел не в то место. Я решил это, передав свой объект панели инструментов в класс, из которого я вызывал setMainColorView(). В этом классе я сделал локальную переменную объекта панели инструментов, присвоив ей это. И тогда это сработало.

10.12.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..