青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

zhonghua

C++博客 首頁 新隨筆 聯系 聚合 管理
  72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

QWidget及其子類都可有右鍵菜單,因為QWidget有以下兩個與右鍵菜單有關的函數:

Qt::ContextMenuPolicy contextMenuPolicy () const

void setContextMenuPolicy ( Qt::ContextMenuPolicy policy )

Qt::ContextMenuPolicy枚舉類型包括:Qt::DefaultContextMenu, Qt::NoContextMenu, Qt::PreventContextMenu, Qt::ActionsContextMenu, and Qt::CustomContextMenu。

使用方式如下:


1)默認是Qt::DefaultContextMenu。
它 是利用右鍵菜單事件contextMenuEvent()來處理(which means the contextMenuEvent() handler is called)。就是要重寫contextMenuEvent( QContextMenuEvent * event )函數。


2)使用Qt::CustomContextMenu。
它是發出QWidget::customContextMenuRequested信號,注意僅僅只是發信號,意味著要自己寫顯示右鍵菜單的slot。
這個信號是QWidget唯一與右鍵菜單有關的信號(也是自有的唯一信號),同時也是很容易被忽略的signal:

void customContextMenuRequested ( const QPoint & pos )

該信號的發出條件是:用戶請求contextMenu(常規就是鼠標右擊啦)且同時被擊的widget其contextMenuPolicy又是Qt::CustomContextMenu。
注 意:pos是該widget接收右鍵菜單事件的位置,一般是在該部件的坐標系中。但是對于QAbstratScrollArea及其子類例外,是對應著其 視口viewport()的坐標系。如常用的QTableView、QHeaderView就是QAbstratScrollArea的子類。
因為僅發信號,所以需自己寫顯示右鍵菜單的slot來響應,例如一個表格(QTableView類型)表頭的顯示右鍵菜單槽:
datatable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);
connect(datatable->horizontalHeader(), SIGNAL(customContextMenuRequested(const QPoint&)),
        this, SLOT(show_contextmenu(const QPoint&)));//this是datatable所在窗口
QMenu *cmenu = NULL;
show_contextmenu(const QPoint& pos)
{
    if(cmenu)//保證同時只存在一個menu,及時釋放內存
    {
        delete cmenu;
        cmenu = NULL;
    }
    QMenu cmenu = new QMenu(datatable->horizontalHeader());
   
    QAction *ascendSortAction = cmenu->addAction("升序");
    QAction *descendSortAction = cmenu->addAction("降序");
    QAction *filterAction = cmenu->addAction("過濾");
    QAction *reshowAction = cmenu->addAction("重載");
   
    connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
    connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
    connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));
    connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));
   
    cmenu->exec(QCursor::pos());//在當前鼠標位置顯示
    //cmenu->exec(pos)是在viewport顯示
}

也可先做好cmenu,好處是始終使用一個:
    QMenu cmenu = new QMenu(datatable->horizontalHeader());
   
    QAction *ascendSortAction = cmenu->addAction("升序");
    QAction *descendSortAction = cmenu->addAction("降序");
    QAction *filterAction = cmenu->addAction("過濾");
    QAction *reshowAction = cmenu->addAction("重載");
   
    connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
    connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
    connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(show_filter_dlg()));
    connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(reshow_data()));
show_contextmenu(const QPoint& pos)
{
    if(cmenu)
    {
        cmenu->exec(QCursor::pos());
    }
}


3)使用Qt::ActionsContextMenu。
把部件的所有action即QWidget::actions()作為context menu顯示出來。
還是上面的例子,要在表格(QTableView類型)表頭顯示右鍵菜單:
        QAction *ascendSortAction = new QAction("升序", this);
        QAction *descendSortAction = new QAction("降序", this);
        QAction *filterAction = new QAction("過濾", this);
        QAction *unfilterAction = new QAction("取消過濾", this);
   
        connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_ascend()));
        connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(sort_descend()));
        connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(filter_table()));
        connect(unfilterAction, SIGNAL(triggered(bool)), this, SLOT(unfilter_table()));
   
        datatable->horizontalHeader()->addAction(ascendSortAction);
        datatable->horizontalHeader()->addAction(descendSortAction);
        datatable->horizontalHeader()->addAction(filterAction);
        datatable->horizontalHeader()->addAction(unfilterAction);
        
        datatable->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);

另外兩個就是不顯示context menu了:
Qt::NoContextMenu
    the widget does not feature a context menu, context menu handling is deferred to the widget's parent.
   
Qt::PreventContextMenu
    the widget does not feature a context menu, and in contrast to NoContextMenu, the handling is not deferred to the widget's parent. This means that all right mouse button events are guaranteed to be delivered to the widget itself through mousePressEvent(), and mouseReleaseEvent().

補充:
    使用Qt::ActionsContextMenu比較簡潔,但是如果需要根據當前菜單彈出的位置來定義不同菜單,或者像上個例子,在表格 (QTableView類型)表頭顯示右鍵菜單時,我需要知道是哪一列表頭被點擊,從而在后來調用sort_ascend()排序函數時能夠根據不同列進 行不同排序策略,那么Qt::ActionsContextMenu就做不到了。
    這種需要捕捉彈出位置的情況只好用Qt::ActionsContextMenu了,customContextMenuRequested ( const QPoint & pos )信號返回點擊位置pos(在表頭視口坐標系中位置),然后表頭即可調用logicalIndexAt(pos)函數得到被點擊section對應的 index即被點擊部分的列號,然后存下來可供后面action激活的排序槽使用。
show_contextmenu(const QPoint& pos)
{
    //get related column of headerview
    contextmenu_column = datatable->horizontalHeader()->logicalIndexAt(pos);

    //show contextmenu
    if(cmenu)
    {
        cmenu->exec(QCursor::pos());
    }
}

posted on 2012-06-01 16:25 米米 閱讀(922) 評論(0)  編輯 收藏 引用 所屬分類: qt
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人一区在线| 欧美一级欧美一级在线播放| 美女爽到呻吟久久久久| 欧美一区二区视频在线| 一区精品在线播放| 欧美激情精品久久久久久变态 | 欧美在线黄色| 欧美一区二区三区在线观看| 亚洲国产高清自拍| 亚洲美女区一区| 国产欧美日韩亚洲| 欧美成人高清视频| 欧美日韩亚洲一区二| 欧美一区二区成人6969| 欧美中文字幕在线播放| 91久久精品国产91性色| 一区二区三区视频在线观看| 国产亚洲精品一区二区| 亚洲福利国产精品| 欧美亚男人的天堂| 另类成人小视频在线| 欧美国产大片| 久久精品一区二区三区中文字幕| 久久久久久久久久看片| 99视频精品在线| 欧美亚洲免费高清在线观看| 亚洲人成网站在线播| 午夜视频久久久久久| 亚洲另类在线一区| 性欧美精品高清| 一区二区三区久久网| 久久精品99国产精品日本| 亚洲精选中文字幕| 欧美在线观看网站| 亚洲一区二区在线视频| 久久婷婷av| 久久久www成人免费精品| 欧美日韩福利视频| 欧美国产精品劲爆| 韩国一区二区三区在线观看| 99国产精品| 亚洲人成毛片在线播放| 久久国产精品99精品国产| 夜夜嗨av一区二区三区四季av| 欧美专区中文字幕| 亚洲欧美在线网| 欧美日韩一区三区四区| 欧美激情在线免费观看| 国产一区二区无遮挡| 亚洲一二三级电影| 亚洲一区二区三区在线观看视频| 久久综合九色综合久99| 久久在线免费观看| 国产一区二区三区久久悠悠色av | 亚洲国产日韩在线一区模特| 国产婷婷色一区二区三区在线| 一区二区欧美在线| 亚洲一级片在线观看| 欧美精品久久99| 亚洲精品久久久久久久久久久 | 国产精品人人做人人爽| 亚洲毛片在线| 一区二区三区精品国产| 欧美电影免费| 亚洲精品在线观看免费| 亚洲品质自拍| 欧美精品福利在线| 亚洲欧洲精品天堂一级| 99精品视频免费观看| 欧美啪啪成人vr| 亚洲视频电影图片偷拍一区| 亚洲亚洲精品三区日韩精品在线视频| 欧美黄色免费| 99精品欧美一区二区三区| 亚洲视频日本| 国产伦精品一区二区三区四区免费 | 久久精品国产欧美亚洲人人爽| 国产毛片精品国产一区二区三区| 亚洲伊人观看| 久久精品综合网| 欧美成人福利视频| 99精品视频免费全部在线| 欧美日韩亚洲视频| 午夜久久久久久| 麻豆精品视频在线| 一区二区欧美日韩| 国产精品国产三级国产普通话99| 午夜精品亚洲| 欧美高清一区二区| 亚洲欧美日韩精品久久奇米色影视| 国产精品视频在线观看| 久久国内精品视频| 亚洲激情影视| 欧美一区二区视频网站| 亚洲国产精品小视频| 欧美日韩国产高清视频| 亚洲欧美日产图| 欧美激情偷拍| 亚洲欧美日韩精品久久奇米色影视 | 久久不射电影网| 亚洲欧洲日韩综合二区| 欧美一级网站| 亚洲美女av黄| 国产亚洲一区二区在线观看 | 国产亚洲精品一区二555| 免费亚洲网站| 亚洲欧美在线x视频| 亚洲国产日韩在线一区模特| 午夜天堂精品久久久久| 亚洲丰满少妇videoshd| 国产精品日韩一区| 欧美成人精品一区二区| 亚洲欧美一区二区激情| 亚洲精品久久久久久久久久久| 欧美中文字幕在线视频| 一本久久知道综合久久| 精品电影在线观看| 国产精品亚洲综合一区在线观看| 欧美11—12娇小xxxx| 亚洲欧美日韩精品久久| 亚洲日本成人| 欧美成人精品在线播放| 亚洲欧美日韩一区在线| 亚洲日本成人| 激情久久五月| 国产日韩亚洲欧美| 国产精品影音先锋| 欧美色道久久88综合亚洲精品| 久久久久久久久一区二区| 亚洲综合999| 亚洲一区二区视频在线观看| 99精品国产福利在线观看免费| 欧美大片在线观看一区二区| 久久久激情视频| 久久精品国产成人| 欧美在线二区| 久久精品国产精品亚洲| 久久精品99无色码中文字幕| 欧美影院视频| 欧美在线观看视频| 久久精品99国产精品| 久久精品国产亚洲aⅴ| 欧美在线免费| 久久精品人人爽| 久久久久高清| 美女免费视频一区| 欧美激情国产精品| 91久久精品一区| 99精品欧美一区二区三区| 一区二区三区国产在线观看| 亚洲免费大片| 亚洲天堂偷拍| 亚洲欧美日韩一区二区| 欧美一二三区精品| 久久久精品动漫| 毛片av中文字幕一区二区| 麻豆精品视频| 欧美日韩在线一二三| 国产精品久久久久久久9999| 国产精品一级| 在线高清一区| 99热在线精品观看| 午夜免费电影一区在线观看| 欧美与欧洲交xxxx免费观看| 久久亚洲二区| 亚洲片在线观看| 亚洲视频你懂的| 久久久久国产精品午夜一区| 欧美成人有码| 国产精品羞羞答答xxdd| 欲色影视综合吧| 日韩一级网站| 久久大逼视频| 欧美激情一区在线观看| 亚洲视频日本| 美女日韩欧美| 国产欧美日韩一区二区三区在线 | 欧美久久久久久蜜桃| 国产精品午夜久久| 亚洲破处大片| 久久久999国产| 一本不卡影院| 久久免费视频网| 国产精品免费久久久久久| 91久久国产综合久久91精品网站| 亚洲专区在线视频| 亚洲国产成人精品女人久久久| 亚洲午夜精品国产| 嫩草影视亚洲| 精品69视频一区二区三区| 亚洲一区二区黄色| 欧美成人资源| 久久国产日韩| 国产精品国产福利国产秒拍| 亚洲青涩在线| 老司机午夜免费精品视频| 亚洲一区二区三区四区五区午夜| 欧美激情一区二区在线| 亚洲国产精品一区二区三区| 欧美专区日韩视频|