У меня есть 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
?
С вашего предыдущего вопроса мы предложили использовать сигнал и слоты. Например:
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
вы не должны бросать.
list->currentIndex().row()
вернет -1, если я не щелкну виджет до щелчка по метке. Во всяком случае, я пытался реализовать ваше решение, но я получаю сообщение об ошибке: нет соответствующей функции для вызова «MainWindow :: connect (ClickableLabel * &, const char *, MainWindow * const, const char *)» connect (mytest-> smallRed, СИГНАЛ (нажал ()), это, СЛОТ (собирается внутри ())); Смотрите мой обновленный вопрос о том, как я создаю свои виджеты.
VideoWidget
? Что это показывает?ClickableLabel