【发布时间】: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