2010-03-05 12 views
1

QComboBox의 항목에 "제거"아이콘을 포함하고 싶지만 마우스 누르기 이벤트를 잡는 데 문제가 있습니다. 나는 combobox에서 그것을 잡으려고 노력했습니다. 그리고 QIcon 클래스를 마우스 오른쪽 버튼으로 잡으려고 다시 시도했습니다. 주사위가 없다. 아무도 이것을하는 방법을 아는가?콤보 박스 내부의 QIcon

-D

+0

어디서 아이콘을 갖고 싶습니까? 텍스트 외에 항상 다음을보십시오 : http://doc.trolltech.com/4.6/qcombobox.html#addItem-2 또는 마우스를 항목 위로 움직일 때만? –

+0

콤보 상자의 아이콘을 클릭 할 때 얼마나 많은 사용자가 항목을 제거 할 것으로 예상합니까? 콤보 상자 외에 별도의 삭제 단추를 만들고 먼저 사용자가 제거하려는 항목을 선택하게하십시오. –

+0

루퍼트에게 - 나는 거기에 아이콘을 가져 오는 데 아무런 문제가 없습니다. 사용자가 클릭 할 때 마우스 이벤트를 수신하려고합니다. – Dutt

답변

0

콤보 상자 안에 트리보기를 넣고 트리의 확인란을 클릭했을 때 액션을 취해야하는 코드를 작성했습니다. 내가 한 일은 콤보 상자에 이벤트 필터를 설치하여 마우스 클릭을 가로 채고 마우스 클릭이 발생한 위치를 파악한 다음 조치를 취하는 것입니다. 아마도 당신은 당신의 아이콘으로 같은 종류의 일을 할 수있을 것입니다. 코드는 다음과 같습니다.

bool TreeComboBox::eventFilter(QObject* object, QEvent* event) 
{ 
    if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease) 
    { 
    QMouseEvent* m = static_cast<QMouseEvent*>(event); 
    QModelIndex index = view()->indexAt(m->pos()); 
    QRect vrect = view()->visualRect(index); 

    if(event->type() == QEvent::MouseButtonPress && 
     (model()->flags(index) & Qt::ItemIsUserCheckable) && 
     vrect.contains(m->pos())) 
    { 
// Your action here 
     ToggleItem(index); 
     UpdateSelectionString(); 
    } 
    if (view()->rect().contains(m->pos())) 
     skipNextHide = true; 
    } 
    return QComboBox::eventFilter(object, event); 
} 
0

어쩌면 당신은 QComboBox::mousePressEvent(QMouseEvent *e)을 구현할 수 있으며, 이벤트가 아이콘 위에 발생한 경우 찾을 QComboBox::iconSize()과 함께 e.x()를 사용합니다.

Qt 스타일이 콤보 상자에서 레이블과 아이콘 위치를 전환하기로 결정하면이 기능이 중단됩니다. 그게 가능하다면 몰라?

+0

하지만 이전 답변에 대한 의견에 동의해야합니다. 나는 이것이 콤보 상자에서 물건을 삭제하기위한 좋은 해결책이라고 생각하지 않는다. 일반적으로 무언가가하기가 어렵다면 일반적이지 않기 때문입니다. 따라서 솔루션은 다른 소프트웨어와 비교하여 일관성이 없습니다. 최종 결과는 종종 외계인 및/또는 서투른 UI이며 사용자는 혼란 스럽거나 불행해질 수 있습니다. – Mathias