从Widget内部从QListWidget中删除项目

时间:2014-11-11 18:29:31

标签: c++ qt qwidget qlistwidget

我的MainWindow中有QListWidget,显示了一个VideoWidgets列表(自定义QWidget)。 VideoWidget有一个可点击的标签,点击标签时应删除文件,然后从QListItem中移除保存VideoWidget的{​​{1}}。这是我的VideoWidget类:

QListWidget

问题是单击VideoWidget::VideoWidget(QWidget *parent) : QWidget(parent) { ClickableLabel *smallRed = new ClickableLabel(this) //... QObject::connect(smallRed,SIGNAL(clicked()),this,SLOT(removeVideo())); } void VideoWidget::removeVideo(){ //...code to remove a file QListWidget* list = myParent->getList(); QListWidgetItem* item = list->takeItem(list->currentIndex().row()); myList->removeItemWidget(item); } 标签不会在QListWidget中选择其项目,这意味着smallRed将返回-1。单击窗口小部件中的任何其他位置可以选择当前项目。要使代码生效,我目前必须先点击list->currentIndex().row()中的任意位置,然后点击其VideoWidget。有没有什么办法可以通过单击ClickableLabel来实现相同的效果?

1 个答案:

答案 0 :(得分:0)

根据您之前的问题,我们建议使用信号和插槽。例如:

for(int r=0;r<3;r++)
{
    QListWidgetItem* lwi = new QListWidgetItem;
    ui->listWidget->addItem(lwi);
    QCheckBox *check = new QCheckBox(QString("checkBox%1").arg(r));
    check->setObjectName("filepath");
    connect(check,SIGNAL(clicked()),this,SLOT(echo()));
    ui->listWidget->setItemWidget(lwi,check);
}

插槽:

void MainWindow::echo()
{
    qDebug() << sender()->objectName() << "should be remmoved";
}

这不是解决此问题的唯一方法,但它显示了所有主要内容,通过信号和插槽机制objectNamesender(),您可以实现所需的一切。

sender()返回发送信号的对象,你可以投射它,但如果你只需要objectName,你就不应该施放。