Qt Widget课程' parent始终为NULL

时间:2014-11-10 19:05:30

标签: c++ qt qwidget

我有一个名为QWidget的自定义VideoWidget类看起来像这样:

VideoWidget::VideoWidget(QWidget *parent) : QWidget(parent)
{
    ClickableLabel *smallRed = new ClickableLabel(this)
    //...
    QObject::connect(smallRed,SIGNAL(clicked()),this,SLOT(removeVideo()));
}
void VideoWidget::removeVideo(){
    //...remove a file
    MainWindow* myParent =  qobject_cast<MainWindow*>(this->parent());        
    QListWidget* myList = myParent->getList();
    QListWidgetItem* item = myList->currentItem();
    myList->removeItemWidget(item);
}

我的MainWindow类中使用参数VideoWidget创建this小部件,然后将其添加到QListWidget。单击smallRed中的VideoWidget标签时,我希望我的程序删除文件,然后运行代码以从我的MainWindow中的QListWidget删除小部件。我的问题是,行MainWindow* myParent = qobject_cast<MainWindow*>(this->parent());总是返回NULL,我不明白为什么。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

看到这段代码,我觉得你有类似的东西:

for(int r=0;r<2;r++)
{
    QListWidgetItem* lwi = new QListWidgetItem;
    ui->listWidget->addItem(lwi);
    ui->listWidget->setItemWidget(lwi, new QCheckBox(QString("checkBox%1").arg(r),this));
    qDebug() 
    << ui->listWidget->itemWidget(lwi)->parent()
    << ui->listWidget->itemWidget(lwi)->parent()->parent()
    << ui->listWidget->itemWidget(lwi)->parent()->parent()->parent()
    << ui->listWidget->itemWidget(lwi)->parent()->parent()->parent()->parent();
}

正如您所看到的,我将this设置为父级,但我的第一个父级也是qt_scrollarea_viewport,因为Qt会重新显示您的小部件。我的代码输出是:

QWidget(0x27c64260, name = "qt_scrollarea_viewport") 
QListWidget(0x27c64240, name = "listWidget") 
QWidget(0x264bedd8, name = "centralWidget") 
MainWindow(0x28fdcc, name = "MainWindow")

如果你有相同的结构,那么使用一些parent()调用

是的,它不是很漂亮,但据我所知,Qt没有像findParent这样的东西,只有findChildren

由于thuga建议它有效,但不是很好,您的VideoWidget不应该知道MainWindow。你应该使用信号和插槽。只需从VideoWidget发出信号并在MainWindow中捕获此信号(写入特殊插槽并移除此插槽中的项目)。 parent()会比这个魔法更好。

答案 1 :(得分:1)

QT中的小部件只有在将它们放入布局时才会自动成为父级。否则,如果您在不传递父指针的情况下创建它们,则它们将在没有父项的情况下创建,并且将成为顶级窗口。

http://qt-project.org/doc/qt-4.8/qobject.html#QObject