从QListWidget中的widget获取变量

时间:2014-11-09 14:27:00

标签: c++ qt qwidget qlistwidget

我有一个名为VideoWidget的自定义QWidget类。它的源文件看起来像这样:

VideoWidget::VideoWidget(QWidget *parent, string test) :
QWidget(parent)
{

    pathname=test;
    QLabel *label= new QLabel(pathname.c_str(), this);
    //...
}
string VideoWidget::getFilePath(){
    return pathname;
}

在我的MainWindow类中,我通过循环遍历xml文件并从该文件中获取字符串参数,将VideoWidget添加到QListWidget

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变量,如下所示:

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;时的值。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

这可能是错误的:

QListWidgetItem* item = ui->myList->itemAt(0,index.row());

方法“itemAt”采用x和y 坐标,而不是索引。请改用“takeItem”。 接下来我想说的是这一部分:

ui->myList->itemWidget(item)

没用。您可以直接转换“item”。 最后 - 使用qtject_cast,因为你使用Qt。永远不要使用dynamic_case(特别是当你不检查结果为NULL时)。