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

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>
            一区二区三区精密机械公司| 久久国产精品久久久久久久久久 | 亚洲精品国产拍免费91在线| 欧美jizzhd精品欧美巨大免费| 久久女同互慰一区二区三区| 卡一卡二国产精品| 欧美激情在线观看| 一本到高清视频免费精品| 亚洲一区二区三区四区视频| 欧美永久精品| 欧美精品久久久久久久| 欧美午夜不卡在线观看免费 | 亚洲国产婷婷综合在线精品| 在线观看视频一区二区欧美日韩| 亚洲成人在线视频播放| 99精品视频免费在线观看| 亚洲欧美日韩国产精品| 久久嫩草精品久久久久| 91久久香蕉国产日韩欧美9色| 一区二区精品在线| 欧美在线亚洲在线| 欧美另类极品videosbest最新版本| 欧美亚日韩国产aⅴ精品中极品| 国产揄拍国内精品对白| 99亚洲精品| 久久一区二区三区av| 亚洲精品影院| 久久九九精品| 国产精品日韩精品| 亚洲精品日产精品乱码不卡| 欧美中文字幕在线观看| 亚洲精品系列| 久久综合久久久久88| 国产精品日韩精品欧美在线| 亚洲精品免费网站| 久热精品在线视频| 亚洲专区免费| 欧美香蕉大胸在线视频观看| 亚洲成色777777在线观看影院 | 性欧美精品高清| 日韩视频一区二区三区在线播放| 亚洲一级黄色| 欧美黑人多人双交| 欧美在线看片| 国产精品久久久爽爽爽麻豆色哟哟 | 久久只有精品| 国产精品久久久一区二区三区| 国产精品视频网| aaa亚洲精品一二三区| 美女主播一区| 久久精品国产99精品国产亚洲性色 | 亚洲一品av免费观看| 久久亚洲图片| 伊甸园精品99久久久久久| 亚洲亚洲精品在线观看| 欧美激情网站在线观看| 99re这里只有精品6| 欧美激情精品久久久久久黑人| 性欧美超级视频| 国产麻豆日韩欧美久久| 午夜精品久久久久久久久久久久 | 亚洲三级视频在线观看| 麻豆成人91精品二区三区| 香蕉av777xxx色综合一区| 国产精品日日摸夜夜摸av| 亚洲免费视频在线观看| 一本色道久久综合亚洲二区三区 | 国产精品久久久久久久久久尿 | 久久精品国产99国产精品澳门| 亚洲已满18点击进入久久| 国产农村妇女精品| 久久疯狂做爰流白浆xx| 久久激情中文| 亚洲人在线视频| 亚洲日本va午夜在线电影| 欧美精品激情| 小黄鸭精品aⅴ导航网站入口| 亚洲欧美怡红院| 1769国内精品视频在线播放| 亚洲激情自拍| 国产精品麻豆va在线播放| 久久久999国产| 久热精品视频在线免费观看| 99精品国产在热久久婷婷| 一区二区三区欧美激情| 国产免费亚洲高清| 欧美成人一区二区三区片免费| 欧美成人在线网站| 亚洲欧美日韩一区在线观看| 欧美亚洲视频| 亚洲精品一区中文| 一区二区三区国产精华| 国产一区二区三区高清在线观看| 欧美国产欧美综合| 国产精品日韩| 亚洲国产日韩在线| 国产亚洲精品久久久久动| 亚洲韩国一区二区三区| 国产日本精品| 亚洲免费观看高清在线观看| 国产日韩欧美中文在线播放| 亚洲二区免费| 国产日韩久久| 亚洲伦理久久| 亚洲国产另类久久久精品极度 | 免费亚洲电影| 欧美一二三区精品| 免费试看一区| 欧美专区在线观看一区| 欧美精品一区二区三区蜜桃| 久久精品主播| 国产精品成人免费视频 | 亚洲精品在线视频| 国产美女在线精品免费观看| 亚洲激情在线观看| 在线播放不卡| 午夜精品久久久久久久蜜桃app| 日韩视频免费大全中文字幕| 久久久精品999| 久久久www免费人成黑人精品 | 99在线精品视频在线观看| 久久国产精品99精品国产| 亚洲制服欧美中文字幕中文字幕| 欧美a级大片| 欧美大片在线影院| 亚洲福利视频网站| 欧美在线视频日韩| 久久激情婷婷| 国产日韩欧美精品在线| 亚洲一区二区三区久久| 亚洲一区三区电影在线观看| 欧美极品影院| 亚洲免费福利视频| 亚洲少妇自拍| 国产精品美女久久福利网站| 亚洲视频一区在线| 午夜精品久久久久久久久久久久| 欧美性大战久久久久久久蜜臀| 亚洲理论电影网| 亚洲一区二区欧美日韩| 欧美日韩免费观看中文| 亚洲美女黄网| 亚洲欧美日韩一区二区三区在线观看 | 欧美日韩亚洲一区二区三区| 欧美激情综合| 日韩写真在线| 欧美三级视频| 亚洲欧美成人一区二区三区| 亚洲欧美一区二区三区极速播放| 国产精品国产三级国产aⅴ入口 | 宅男噜噜噜66一区二区 | 久久午夜精品一区二区| 欧美电影免费观看| 亚洲少妇最新在线视频| 国产精品久久久久久久久久久久久| 亚洲图片欧美日产| 久久九九精品| 亚洲精品视频一区| 国产精品卡一卡二卡三| 欧美自拍偷拍午夜视频| 亚洲第一级黄色片| 亚洲视频福利| 国内不卡一区二区三区| 巨乳诱惑日韩免费av| 久久免费的精品国产v∧| 久久久久国产一区二区三区| 欧美在线观看视频在线| 激情综合色综合久久综合| 免费日韩一区二区| 中国成人亚色综合网站| 久久精品一区蜜桃臀影院| 亚洲激情在线观看视频免费| 国产精品久久久91| 另类专区欧美制服同性| 在线视频欧美日韩精品| 另类天堂av| 亚洲综合不卡| 最新中文字幕亚洲| 国产日产精品一区二区三区四区的观看方式 | 国产伦精品一区二区三区| 亚洲综合激情| 亚洲国产成人精品久久| 欧美影视一区| 在线一区日本视频| 亚洲福利久久| 国产色视频一区| 欧美三级电影精品| 欧美成人亚洲成人| 久久九九全国免费精品观看| 亚洲一区二区三区四区中文| 欧美黄色一级视频| 久久免费偷拍视频| 午夜精品福利一区二区三区av | 99这里只有久久精品视频| 久久野战av| 欧美在线国产精品| 亚洲中无吗在线| 一区二区三区四区五区精品| 亚洲欧洲精品一区二区| 国产一区二区三区无遮挡|