在特製 Widget 的使用右鍵選單
前言
在先前的 在 TreeView 使用右鍵選單 使用過右鍵選單,但 TreeView 是由外部控制,而特製 Widget 時是採用"繼承"的方法來控制,這次把學習的過程做個紀錄。
內容
先到 [ GitLab ] HelloQt 下載範例,這次應用的專案路徑
(HelloQt' directory)/Widget/CustomMenu,執行結果如下
範例的執行結果 |
在特製的 Widget 上按下右鍵會跳出右鍵選單。
看到程式碼的部分,看到特製 Widget 的宣告,程式碼如下
#include <QWidget> #include <QPainter> #include <QMenu> #include <QAction> class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget *parent = nullptr); protected: void paintEvent(QPaintEvent *event) override; void onTreeViewCustomMenu(const QPoint &pos); void onTreeViewAction1Trigger(); void onTreeViewAction2Trigger(); void onTreeViewAction3Trigger(); signals: // private: QMenu* m_pTreeViewCustomMenu; };
右鍵選單在宣告的部分和之前的 TreeView 用馬差不多,只是這次是把事件直接宣告在 Widget ,而非 MainWindow 。接著看到實現的部分,程式碼如下
#include "mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { this->setContextMenuPolicy(Qt::CustomContextMenu); connect( this , &QWidget::customContextMenuRequested , this , &MyWidget::onTreeViewCustomMenu ); //Set up custom menu m_pTreeViewCustomMenu = new QMenu( this ); QAction* pAct1 = new QAction( "Action 1" , this ); connect( pAct1 , &QAction::triggered , this , &MyWidget::onTreeViewAction1Trigger ); m_pTreeViewCustomMenu->addAction( pAct1 ); QAction* pAct2 = new QAction( "Action 2" , this ); connect( pAct2 , &QAction::triggered , this , &MyWidget::onTreeViewAction2Trigger ); m_pTreeViewCustomMenu->addAction( pAct2 ); QAction* pAct3 = new QAction( "Action 3" , this ); connect( pAct3 , &QAction::triggered , this , &MyWidget::onTreeViewAction3Trigger ); m_pTreeViewCustomMenu->addAction( pAct3 ); } void MyWidget::paintEvent(QPaintEvent *event) { QPainter painter( this ); QPen pen( Qt::black ); pen.setWidth( 4 ); painter.setPen( pen ); QRect rc( 4 , 4 , this->width() - 8, this->height() - 8 ); painter.drawRect( rc ); } void MyWidget::onTreeViewCustomMenu(const QPoint &pos) { // m_pTreeViewCustomMenu->popup( this->mapToGlobal( pos ) ); } void MyWidget::onTreeViewAction1Trigger() { qDebug( "Action1 triggered" ); } void MyWidget::onTreeViewAction2Trigger() { qDebug( "Action2 triggered" ); } void MyWidget::onTreeViewAction3Trigger() { qDebug( "Action3 triggered" ); }
看到 MyWidget::MyWidget() ,開頭需要執行 setContextMenuPolicy() ,這很重要,接著綁定 customContextMenuRequested() 事件,最後是 Menu 的初始化的部分,這部分和之前的 TiewView 範例一樣。觸發事件的部分就和之前 TiewView 的範例一樣,就只是剪貼過來。 右鍵選單的用法不管是外部控制或繼承幾乎是走同一個流程,本來還擔心繼承的用法會有所不同,看來是我多慮了。
沒有留言:
張貼留言