我有一个名为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;
时的值。我在这里缺少什么?
答案 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时)。