У меня есть собственный класс QWidget, называемый VideoWidget
. Его исходный файл выглядит примерно так:
VideoWidget::VideoWidget(QWidget *parent, string test) :
QWidget(parent)
{
pathname=test;
QLabel *label= new QLabel(pathname.c_str(), this);
//...
}
string VideoWidget::getFilePath(){
return pathname;
}
В моем классе MainWindow
я добавляю VideoWidget
в QListWidget
через цикл через xml файл и получаю строковый аргумент из этого файла следующим образом:
QDomNode node = rootXML.firstChild();
while( !node.isNull() )
{
if( node.isElement() )
{
QDomElement element = node.toElement();
VideoWidget* mytest = new VideoWidget(this, element.attribute( "Pathname", "not set").toStdString());
QListWidgetItem* item = new QListWidgetItem;
item->setSizeHint(QSize(150,100));
ui->myList->addItem(item);
ui->myList->setItemWidget(item,mytest);
}
node = node.nextSibling();
}
Это правильно заполняет мой QListWidget
с помощью VideoWidget
где все метки имеют другое значение. Теперь я хотел бы получить переменную pathname
каждый раз, когда я дважды QListWidget
элемент в QListWidget
следующим образом:
connect(ui->myList,SIGNAL(doubleClicked(QModelIndex)),this,SLOT(playClip(QModelIndex)));
void MainWindow::playClip(QModelIndex index){
QListWidgetItem* item = ui->myList->itemAt(0,index.row());
VideoWidget* widget = dynamic_cast<VideoWidget*>(ui->myList->itemWidget(item));
cout << widget->getFilePath() << endl;
}
Моя проблема в том, что widget->getFilePath()
всегда возвращает одно и то же значение для каждого щелкнутого виджета. Это значение в первый раз, когда я установил pathname=test;
, Что мне здесь не хватает?
Вероятно, это ошибка:
QListWidgetItem* item = ui->myList->itemAt(0,index.row());
Метод "itemAt" принимает координаты x и y, а не индексы. Вместо этого используйте "takeItem". Следующая вещь, которую я хочу сказать, состоит в том, что эта часть:
ui->myList->itemWidget(item)
бесполезно. Вы можете напрямую конвертировать "элемент". И последнее - используйте qobject_cast, так как вы используете Qt. И никогда не используйте dynamic_case (особенно, когда вы все равно не проверяете результат против NULL).