Удаление элемента из QListWidget из виджета

0

У меня есть QListWidget в моем MainWindow, который отображает список VideoWidgets (пользовательский QWidget). VideoWidget есть ярлык с щелчком, который при нажатии на ярлык должен удалить файл, а затем удалить QListItem который содержит VideoWidget из QListWidget. Вот мой класс 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() Row list->currentIndex().row() вернет -1. Если щелкнуть в другом месте в виджетах, выберите текущий элемент. Для того, чтобы код работал, мне нужно сначала щелкнуть в любом месте VideoWidget а затем щелкнуть его ClickableLabel. Есть ли способ добиться такого же эффекта одним щелчком мыши по моей ClickableLabel?

  • 0
    Нужно больше информации. Каково содержание VideoWidget ? Что это показывает?
  • 0
    см. мой предыдущий вопрос stackoverflow.com/questions/26802294/… . Это в значительной степени виджет, который отображает 4 различных метки. Один из них - ClickableLabel
Показать ещё 1 комментарий
Теги:
qt
qwidget
qlistwidget

1 ответ

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

Это не единственный способ решить эту проблему, но он показывает все основные вещи, с механизмами сигналов и слотов, objectName и sender() вы можете достичь всего, что вам нужно.

sender() возвращает объект, который посылает сигнал, вы можете его отбрасывать, но если вам нужно только objectName вы не должны бросать.

  • 0
    Разве это не делает то же самое, но теперь у меня просто есть слот в классе MainWindow. Я думаю, что у меня все еще будет проблема, что list->currentIndex().row() вернет -1, если я не щелкну виджет до щелчка по метке. Во всяком случае, я пытался реализовать ваше решение, но я получаю сообщение об ошибке: нет соответствующей функции для вызова «MainWindow :: connect (ClickableLabel * &, const char *, MainWindow * const, const char *)» connect (mytest-> smallRed, СИГНАЛ (нажал ()), это, СЛОТ (собирается внутри ())); Смотрите мой обновленный вопрос о том, как я создаю свои виджеты.
  • 0
    @testus Является ли clickableLabel указателем? Это подкласс QLabel?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню