2014-11-11 4 views
0

У меня есть QListWidget в моем MainWindow, который отображает список VideoWidgets (пользовательский QWidget). VideoWidget имеет щелчок, на который нажимается метка, он должен удалить файл, а затем удалить QListItem, который содержит VideoWidget от QListWidget. Вот мой класс 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); 
} 

Проблема заключается в том, что при нажатии на smallRed ярлык не будет выбрать его пункт в QListWidget, что означает, что list->currentIndex().row() вернет -1. Если щелкнуть в другом месте в виджетах, выберите текущий элемент. Для того, чтобы код работал, мне нужно сначала щелкнуть в любом месте в VideoWidget, а затем щелкнуть его ClickableLabel. Есть ли способ добиться такого же эффекта одним нажатием на мой ClickableLabel?

+0

Нужна дополнительная информация. Каково содержимое «VideoWidget»? Что он показывает? – thuga

+0

см. Мой предыдущий вопрос http://stackoverflow.com/questions/26802294/how-to-create-custom-layout-for-widget/. Его довольно виджет, который отображает 4 разных ярлыка. Один, если они являются «ClickableLabel» – testus

+0

Я думаю, что лучший вариант здесь - использовать «QListView» и нарисовать свой пользовательский виджет с помощью специального делегата. Используйте ['QAbstractItemDelegate :: editorEvent'] (http://qt-project.org/doc/qt-5/qabstractitemdelegate.html#editorEvent) для обработки щелчков мышью на ярлыке remove. Вы можете проверить [этот ответ] (http://stackoverflow.com/a/11778012/2257050), чтобы понять, как это можно сделать. Проверьте [этот пример] (http://kunalmaemo.blogspot.fi/2010/12/creating-custom-qitemdelegate-with.html) тоже. – thuga

ответ

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

Slot:

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, SIGNAL (clicked()), это, SLOT (goingInside())); ** См. мой обновленный вопрос о том, как я создаю свои виджеты. – testus

+0

@testus Является ли clickableLabel указателем? Это подкласс QLabel? – Chernobyl

+0

@testus Check также включает: включить ClickableLabel в mainwindow, я думаю, вы забыли сделать это. Этот ответ: http://stackoverflow.com/questions/15768144/qt-subclassing-and-no-matching-function-for-call-to-connect – Chernobyl