我有一个名为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,我不明白为什么。非常感谢任何帮助。
答案 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中的小部件只有在将它们放入布局时才会自动成为父级。否则,如果您在不传递父指针的情况下创建它们,则它们将在没有父项的情况下创建,并且将成为顶级窗口。