【问题标题】:Removing item from QListWidget from inside a Widget从小部件内部从 QListWidget 中删除项目
【发布时间】:2014-11-11 18:29:30
【问题描述】:

我的 MainWindow 中有一个 QListWidget,它显示了 VideoWidgets 列表(自定义 QWidget)。 VideoWidget 有一个可点击的标签,点击该标签应该删除一个文件,然后从QListWidget 中删除包含VideoWidgetQListItem。这是我的 VideoWidget 类:

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);
}

问题是单击smallRed 标签不会在QListWidget 中选择它的项目,这意味着list->currentIndex().row() 将返回-1。单击小部件中的任何其他位置都会选择当前项目。为了使代码正常工作,我目前必须先单击VideoWidget 中的任意位置,然后单击其ClickableLabel。有什么方法可以让我一键点击ClickableLabel达到同样的效果?

【问题讨论】:

  • 需要更多信息。 VideoWidget的内容是什么?它显示了什么?
  • 查看我之前的问题stackoverflow.com/questions/26802294/…。它几乎是一个显示 4 个不同标签的小部件。如果他们是ClickableLabel
  • 我认为这里最好的选择是使用QListView 并使用自定义委托绘制您的自定义小部件。使用QAbstractItemDelegate::editorEvent 处理删除标签上的鼠标点击。您可以查看this answer 了解如何完成。也检查this example

标签: c++ qt qwidget qlistwidget


【解决方案1】:

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

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你不应该强制转换。

【讨论】:

  • 这不是做同样的事情,但现在我只在 MainWindow 类中有我的插槽。如果我在单击标签之前不单击小部件,我想我仍然会遇到list-&gt;currentIndex().row() 将返回-1 的问题。无论如何,我尝试实施您的解决方案,但我收到错误 error: no matching function for call to 'MainWindow::connect(ClickableLabel*&, const char*, MainWindow* const, const char*)'connect( mytest->smallRed, SIGNAL(clicked()),this,SLOT(goingInside())); 查看我更新后的问题,了解如何创建小部件。
  • @testus 检查还包括:在主窗口中包含 ClickableLabel,我想你忘了这样做。这个答案:stackoverflow.com/questions/15768144/…
  • 哦,是的,你是对的。我完全忘记了包含。我现在可以编译它,但是当我点击标签时,我得到 "" 应该被删除,即使我先点击小部件
  • @testus 在您的情况下,标签是发件人,因此这意味着您的标签没有对象名称,请添加此名称mytest-&gt;smallRed-&gt;setObjectName("filepath");
  • @testus 我教你如何正确使用它:)。关于你的问题,所以很难说,我记得你之前的问题:stackoverflow.com/questions/26802294/… 所以你的小部件非常复杂/这意味着你的应用程序很重,你不能使用很多项目(因为它会非常昂贵系统)所以我只看到下一个方法。我不喜欢它,但是...迭代将所有项目扔到 listwidget 中,为所有项目获取 itemWidget 指针并检查此指针是否是您当前的小部件(您的发件人(您的标签))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多