【问题标题】:C++ Qt Segmentation fault when trying to access method of an object尝试访问对象的方法时出现 C++ Qt 分段错误
【发布时间】:2015-12-09 19:32:55
【问题描述】:

我正在学习 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() 中调用 方法。

到目前为止,我已经尝试公开颜色按钮变量, 我也尝试过在构造函数中初始化名为 test 的对象,但都不起作用。

现在,使用此代码,我得到的错误是 “下级停止了,因为它收到了来自操作系统的信号。 信号名称:SIGSEGV 信号含义:分段错误" 带有指向 test->testMethod() 的箭头。我不知道如何解决它,任何帮助将不胜感激

【问题讨论】:

  • 什么时候调用 setMainColorView()?你确定测试在那个时候被初始化了吗?如果您使用的是 Qt Creator,请在您初始化测试的位置和使用它的位置上运行带有断点的调试器。确保它首先被初始化,当它在使用它时遇到断点时,检查它以确保它是一个有效的对象。
  • @Ninjammer setMainColorView() 是从另一个类调用的。我正在尝试使用在 setToolbar 中创建的现有测试对象,而不是创建另一个对象
  • 我知道你想要做什么,这就是为什么我建议使用带断点的调试器,这样你就可以检查事情是否按照你期望的顺序发生,并检查你正在尝试的对象使用。即使没有断点,如果您通过调试器运行它并且它在使用测试对象时出现段错误,您可以在该点看到 test 是否为空,或者 testMethod() 中的某些内容是否出错。
  • @Ninjammer 知道了,我会再次检查并回复您。
  • 它是公开的,所以它应该是。调试器告诉你关于测试的什么?它的值是否为 0?这意味着在运行时测试对象有问题。如果是 testMethod() 无法访问的问题,您会在编译时发现。

标签: c++ qt pointers segmentation-fault cross-platform


【解决方案1】:

我一直在看错误的地方。我通过将工具栏对象传递到我从中调用 setMainColorView() 的类中解决了这个问题。在那个类中,我创建了工具栏对象的局部变量,并分配了它。然后就成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多