2014-11-11 5 views
0

내 MainWindow에 QListWidget이 있는데 VideoWidgets (맞춤형 QWidget) 목록이 표시됩니다. VideoWidget에는 클릭 가능한 레이블이 있습니다. 레이블을 클릭하면 파일을 삭제 한 다음 VideoWidget이있는 QListItem을 제거해야합니다 (QListWidget). 여기 내 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); 
} 

문제는 smallRed 라벨을 클릭하면 list->currentIndex().row()이 돌려 보낼 -1 의미 QListWidget에서의 항목을 선택하지 것입니다. 위젯의 다른 곳을 클릭하면 현재 항목이 선택됩니다. 코드가 작동하려면 현재 VideoWidget의 아무 곳이나 클릭 한 다음 ClickableLabel을 클릭해야합니다. 내 ClickableLabel을 한 번의 클릭으로 동일한 효과를 얻을 수있는 방법이 있습니까?

+0

추가 정보가 필요합니다. 'VideoWidget'의 내용은 무엇입니까? 그것은 무엇을 보여줍니까? – thuga

+0

내 이전 질문보기 http://stackoverflow.com/questions/26802294/how-to-create-custom-layout-for-widget/. 그것의 꽤 많은 위젯 4 가지 라벨을 표시합니다. 하나는 'ClickableLabel' – testus

+0

나는 여기에 최선의 선택은'QListView'를 사용하고 사용자 정의 위젯을 사용자 정의 델리게이트로 칠하는 것이라고 생각합니다. remove 레이블에서 마우스 클릭을 처리하려면 ['QAbstractItemDelegate :: editorEvent'] (http://qt-project.org/doc/qt-5/qabstractitemdelegate.html#editorEvent)를 사용하십시오. 방법에 대한 아이디어를 얻으려면 [이 답변] (http://stackoverflow.com/a/11778012/2257050)을 확인하십시오. [이 예제] (http://kunalmaemo.blogspot.fi/2010/12/creating-custom-qitemdelegate-with.html)도 확인하십시오. – thuga

답변

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"; 
} 

그것은이 문제를 해결하는 유일한 방법은 아니지만, 그것은 당신이 모두를 달성 할 수 sender() 신호와 슬롯 메커니즘, objectName으로, 모든 주요 것을 보여주고 무엇을 너는 필요해.

sender() 신호를 보내는 귀환 물체는 전송할 수 있지만, objectName 만 필요한 경우에는 전송하면 안됩니다.

+0

같은 일을하지는 않지만 이제는 MainWindow 클래스에 슬롯이 있습니다. 레이블을 클릭하기 전에 위젯을 클릭하지 않으면'list-> currentIndex(). row()'가 -1을 반환한다는 문제가 여전히 남아 있다고 생각합니다. 어쨌든, 귀하의 솔루션을 구현하려하지만 오류가 발생했습니다 ** 오류 : 'MainWindow :: connect (ClickableLabel * &, const char *, MainWindow * const, const char *)'호출에 대해 일치하는 함수가 없습니다. connect (mytest -> smallRed, SIGNAL (clicked()), this, SLOT (goingInside())) ** 위젯을 어떻게 만드는지 업데이트 된 질문을 참조하십시오. – testus

+0

@testus clickableLabel은 포인터입니까? QLabel 하위 클래스입니까? – Chernobyl

+0

@testus 확인은 다음을 포함합니다 : 메인 윈도우의 ClickableLabel을 포함합니다. 잊어 버린 것 같습니다. 이 대답은 : http://stackoverflow.com/questions/15768144/qt-subclassing-and-no-matching-function-for-call-to-connect – Chernobyl