2010-12-04 7 views
1

내 QTableView의 셀에 컨텍스트 메뉴가 필요합니다. 그래서 처음 연결되었습니다.Qt/C++ : QTableView 컨텍스트 메뉴 및 정보 전달

connect(ui->tblTimesheet,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(sheetContextMenu(const QPoint &))); 

그리고 그 연결을위한 슬롯은 아래와 같습니다 :

void wndMyWindow::sheetContextMenu(const QPoint &pos){ 
    QMenu *menu = new QMenu; 
    QModelIndex cell = ui->tblTimesheet->indexAt(pos); 
    // Make sure the right click occured on a cell! 
    if(cell.isValid()){ 
     QString myid=cell.sibling(cell.row(),0).data().toString(); 
     menu->addAction("Remove item", this, SLOT(sheetRemoveItem())); 
     menu->exec(ui->tblTimesheet->mapToGlobal(pos)); 
    } 
} 

그러면 메뉴가 생성되고 해당 동작을 클릭 할 때 함수를 호출하는 메뉴. 그러나 변수 myid를 두 번째 슬롯으로 전달하려고합니다. 그 슬롯은 아래에 열거되어 있습니다 :

void wndMyWindow::sheetRemoveItem(){ 
    qDebug("Sure I'm here, but what info do I have?"); 
    return; 
} 

저는 어떻게하는지 잘 모릅니다, 아무도 도와 줄 수 있습니까?

답변

2

이와 관련하여 Qt 신호/슬롯은 콜백 및 기타 신호/슬롯 메커니즘과 비교하여 빨라집니다. 정말로 추가 정보를 첨부 할 수 없습니다.

몇 가지 당신이 생각 할 수 있습니다

  1. 가 보내려는 정보를 저장하는 객체를 생성, 그것을 슬롯을 제공하고 응답 할 신호에 연결, 새로운 신호를 방출 정보, 그 신호에 붙이십시오.

  2. 신호에 약간의 데이터 변형을 첨부하려면 Qt 신호 맵을 사용하십시오.

  3. 발신자를 Qt 슬롯에 가져올 수 있습니다. 필요한 정보 일 수 있습니다. (신호/슬롯에 대한 Qt 문서 참조).

이러한 방법 중 어느 것도 효과가 없다고해도 유감스럽게 생각합니다. Qt가 C++ 전처리 기와 템플릿과 호환되지 않기 때문에 # 1을 자동 생성하고 boost :: signal에 첨부하는 방법을 연구하고 있습니다. 더 강력 할 것이지만 많은 노력이 필요합니다.

행운을 빈다.

+1

그래, 주변을 둘러 본 것이 많을수록 특정 위젯에 대해 몇 가지 작업을 수행 할 수있는 컨텍스트 메뉴의 전체 지점이 아니기 때문에 가능한 바보 같은 것처럼 보입니다. 전역 작업을 원한다면 일반 메뉴 나 다른 유형의 인터페이스 위젯을 사용할 것입니다! 내가 쓴 것은 내 폼에 private 멤버를주는 것입니다. QModelIndex lastCellRightClicked; void wndMyWindow :: sheetContextMenu (const QPoint & pos) 슬롯에 설정 한 다음 void wndMyWindow :: sheetRemoveItem() 슬롯에 사용합니다. Good Enough ™. – Joseph

+0

특정 메뉴 항목에 대해 특정 작업을 구현하기를 원한다면 항목의 QAction에 첨부하십시오. –

1

이전 답변을 읽은 후 실제로 일부 데이터를 발신자에게 첨부 할 수 있음을 알았습니다. 나는 내 코드에서 그것을한다.

QObject에서 상속 한 모든 객체에는 "setProperty()"가 있습니다. 여기서 신호를 보내기 전에 일부 데이터를 설정할 수 있습니다. 내 슬롯 중 하나에서 다음을 수행합니다.

qobject_cast<QAction*>(sender())->property("index").toInt() 

이렇게하면 작업에 인덱스를 첨부 할 수 있습니다.

+0

아니면 그냥 QAction :: setData()/QAction :: data() 메소드를 사용할 수 있습니다. – ScumCoder