2013-01-09 13 views
9

私は周りを見回し、ツリーウィジェットだけでなく他のウィジェットに対しても問題が存在するようです。しかし、私の場合、私は解決策を見つけましたが、不完全な解決策でした。ツリーウィジェットにアクションを追加しています。そのため、右クリックすると、これらのアクションを含むポップアップが表示されます。しかし、ツリーウィジェットにアイテムを追加して右クリックすると、同じポップアップが表示されます。 ツリーウィジェットを右クリックすると、ツリーウィジェットのポップアップメニューが表示され、アイテムを右クリックすると、対応する別のポップアップメニューが表示されます。誰もこれを行う方法を知っていますか?QTreeWidget右クリックメニュー

答えて

14

まずカスタムコンテキストメニューのポリシーを設定する必要があります。

treeView->setContextMenuPolicy(Qt::CustomContextMenu); 

次にあなたがQWidget::customContextMenuRequested(const QPoint&)信号に接続して、コンテキストメニューを表示することができます。

+0

私は頑張っているようです。だから実際には私のスロットにcustomContextMenuRequested信号を接続する必要がありますか? – ISTB

+0

はい、その信号を捕まえた後にカスタムコンテキストメニューを表示するスロットが必要です。 – hank

2

QAbstractItemModelのオーバーロードを見て、独自のOnContextMenuRequestedを提供してください。この機能を使用すると、異なる項目で異なるコンテキストメニューを作成できます。

void MyModel::OnContextMenuRequested(const QModelIndex& index, const QPoint& globalPos) 
{ 
// find 'node' corresponding to 'index' 

vector<pair<string,BaseNode*> > actions = node->GetActions(true); 
if(actions.size()==0) return; 

// the ptr list helps us delete the actions 
boost::ptr_list<QObject> actionPtrList; 
QList<QAction*> qtActions; 
for(unsigned int i=0;i<actions.size();i++) 
{ 
    QAction* act = new QAction(actions[i].first.c_str(),NULL); 
    act->setData(qVariantFromValue(actions[i].second)); 
    actionPtrList.push_back(act); 
    qtActions.append(act); 
} 

// create and show the context menu 
QMenu *menu = new QMenu("Item actions",NULL); 
actionPtrList.push_back(menu); 
QAction* act = menu->exec(qtActions,globalPos); 
if(act==NULL) return; 

// act on the resulting action 'act' 
} 
+1

しかし、これがモデルにある理由はありません。それは、モデルが典型的には知らないはずのビューからの信号です。 –

14

まず、コンフィグQTreeWidget応答(発する信号)、マウスの右クリックに:

treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); 

セカンドここ

が役に立つかもしれ私のプロジェクトの1からいくつかの短縮擬似っぽいコードですあなたのスロット "MainWindow :: prepareMenu"と信号を接続してください:

connect(treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow::prepareMenu); 

第3に、コンテキストメニュースロット内:

void MainWindow::prepareMenu(const QPoint & pos) 
{ 
QTreeWidget *tree = treeWid; 

QTreeWidgetItem *nd = tree->itemAt(pos); 

qDebug()<<pos<<nd->text(0); 


QAction *newAct = new QAction(QIcon(":/Resource/warning32.ico"), tr("&New"), this); 
newAct->setStatusTip(tr("new sth")); 
connect(newAct, SIGNAL(triggered()), this, SLOT(newDev())); 


QMenu menu(this); 
menu.addAction(newAct); 

QPoint pt(pos); 
menu.exec(tree->mapToGlobal(pos)); 
} 
関連する問題