我是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的新手,我可能已经忘记了重要的事情。随便问一下;)
答案 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();
}
您似乎正在接受一个相当大的项目,但正在学习一次性构建所需的组件。我以前去过那里,根据我的经验,我强烈建议在继续之前为基础知识打下坚实的基础。几周/几个月的前期努力相当于节省了大量时间。
请尝试一下并告诉我。我希望这会有所帮助。