我的MainWindow中有一个QListWidget
,它显示VideoWidgets的列表(一个自定义QWidget
)。VideoWidget
有一个可点击的标签,在点击标签时,它应该删除一个文件,然后从QListWidget
中删除保存VideoWidget
的QListItem
。下面是我的VideoWidget类:
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
上点击一下就能达到同样的效果
发布于 2014-11-11 19:00:49
从您之前的问题中,我们建议使用信号和插槽。例如:
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
,则不应该强制转换。
https://stackoverflow.com/questions/26871889
复制