我的MainWindow中有QListWidget
,显示了一个VideoWidgets列表(自定义QWidget
)。
VideoWidget
有一个可点击的标签,点击标签时应删除文件,然后从QListItem
中移除保存VideoWidget
的{{1}}。这是我的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);
}
标签不会在QListWidget中选择其项目,这意味着smallRed
将返回-1。单击窗口小部件中的任何其他位置可以选择当前项目。要使代码生效,我目前必须先点击list->currentIndex().row()
中的任意位置,然后点击其VideoWidget
。有没有什么办法可以通过单击ClickableLabel
来实现相同的效果?
答案 0 :(得分: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);
}
插槽:
void MainWindow::echo()
{
qDebug() << sender()->objectName() << "should be remmoved";
}
这不是解决此问题的唯一方法,但它显示了所有主要内容,通过信号和插槽机制objectName
和sender()
,您可以实现所需的一切。
sender()
返回发送信号的对象,你可以投射它,但如果你只需要objectName
,你就不应该施放。