Qt Sigsev在topLevelItemCount上

时间:2017-03-04 10:21:03

标签: c++ qt

我是Qt的新手,想要在我的treeWidget为空时执行某些操作。

我尝试过topLevelItemCount,但是没有用;

if (treeWidget_2->topLevelItemCount() == 0) {
     //this doesn't even get executed.
}

我这样做时会得到 segfault 。我完全确定它是因为toplevelCount,因为我使用调试器完成了它。

BTW:我的TreeWidget不是空的。它有一个项目,这有一个子项目

treeWidet
    |-----test
            |---test

我也跟着 this 教程并创建了一个函数treeCount:

int MainWindow::treeCount(QTreeWidget *tree, QTreeWidgetItem *parent = 0) //counts the nodes inside a specific tree
{
    int count = 0;
    if (parent == 0) {
        int topCount = tree->topLevelItemCount();
        for (int i = 0; i < topCount; i++) {
            QTreeWidgetItem *item = tree->topLevelItem(i);
        }
        count += topCount;
    } else {
        int childCount = parent->childCount();
        for (int i = 0; i < childCount; i++) {
            QTreeWidgetItem *item = parent->child(i);
        }
        count += childCount;
    }
    return count;
}

我改变了一点以满足我的需要。 没问题。真正的斗争是这个错误信息:

default argument given for parameter 3 of 'int blablabla' [-fpremissive]

int MainWindow::treeCount(QTreeWidget *tree, QTreeWidgetItem *parent = 0)
                                                                       ^

我在Linux上使用Qt 5.7。 (GNOME,如果重要的话)

由于我是Qt的新手,我可能已经忘记了重要的事情。随便问一下;)

1 个答案:

答案 0 :(得分:0)

我仔细阅读了所提供的代码,并发现了一些问题:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

在这里,您应该这样做:ui(new Ui::MainWindow)。基本思想是该类存在,但不构造并可以使用;这就是你的QTreeWidget为空的原因。有关这两个电话之间差异的更详细说明,请查看此Stackoverflow question

现在,我不清楚为什么你有一个指向你new这个对象的单独指针。据我了解,this指针将满足您的需求:无需使用new创建MainWindow对象并将其存储起来!如果这样做,您也不需要在析构函数中显式删除该对象。如果您认为要明确删除,请参阅此Stackoverflow Question以获取有关delete this;的说明。您的代码中的简短答案是&#34;否&#34;。你不应该在析构函数中调用delete this

我还注意到以下问题:

  • explicit MainWindow(QWidget *parent = 0);在这种情况下,设置默认值0似乎不是一个好主意。我建议删除它,除非你有充分的理由保留它。
  • 整体代码有点令人困惑,因为函数名称并不能很好地反映其目的,至少对我而言。我建议重新命名一些函数以使代码更具可读性。例如,我希望newNode()与创建新节点有关,但它实际上会调用collapseAll(): -

    void MainWindow::newNode() { 
        ui->treeWidget->collapseAll();
    }
    
  • 您似乎正在接受一个相当大的项目,但正在学习一次性构建所需的组件。我以前去过那里,根据我的经验,我强烈建议在继续之前为基础知识打下坚实的基础。几周/几个月的前期努力相当于节省了大量时间。

请尝试一下并告诉我。我希望这会有所帮助。