2010-12-04 9 views
1

私のQTableViewのセルにcontextmenuが必要なので、最初に接続しました: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を2番目のスロットに渡したいと思います。そのスロットは以下の通りです:

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

これを行う方法がわかりません。

答えて

2

これに関して、Qt信号/スロットは、コールバックおよび他の信号/スロット機構と比較して、吸い込まれる。あなたは本当に余分な情報を添付することはできません。あなたがが行うことができます

カップルの事:

  1. で新しい信号を発し、あなたは、送るそれにスロットを与え、あなたに応答する信号に付加する情報を格納するオブジェクトを作成します。情報は、その信号に添付してください。

  2. Qt信号マップのthingyを使用して、データに小さな変化を信号に付けることができます。

  3. Qtスロットに送信者を置くことができます。これは必要な情報かもしれません。 (信号/スロットに関するQtドキュメントを参照してください)。

これらの方法のどれもあなたのために機能しない場合、申し訳ありませんが、あなたはかなりfsckedです。 QtはC++のプリプロセッサやテンプレートと互換性がないので、#1を自動的に作成してより強力なboost :: signalにアタッチする方法に取り組んでいますが、多くの労力が必要です。

幸運。

+1

ええ、私は周りを見回しましたが、特定のウィジェットで何らかのアクションを実行できるようにするためにコンテキストメニューの全体的なポイントがないので、かなり愚かなようです。グローバルなアクションが必要な場合は、通常のメニューや他のタイプのインターフェースウィジェットを使用します。私が行ったことは、自分のフォームにプライベートメンバーを与えることでした。QModelIndex lastCellRightClicked;空のwndMyWindow :: sheetContextMenu(const QPoint&pos)スロットに設定し、それをvoid wndMyWindow :: sheetRemoveItem()スロットで使用します。 Good Enough™。 – Joseph

+0

特定のメニュー項目に対して特定のものを実装したい場合は、その項目のQActionにアタッチするだけです。 –

1

前の回答を読んだ後に、実際に送信者にデータを添付できることに気付きました。私は自分のコードでそれをします。

QObjectから継承するすべてのオブジェクトには、「setProperty()」があります。ここでは、信号の送信を開始する前にいくつかのデータを設定できます。私のスロットの1つで、私は次のことを行います:

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

これは私の行動にインデックスを付けることができます。

+0

また、QAction :: setData()/ QAction :: data()メソッドを使用することもできます。 – ScumCoder

関連する問題