• 8227阅读
  • 7回复

[提问]Qt右键菜单和QTreeWidget相关问题 [复制链接]

上一主题 下一主题
离线sword_master
 

只看楼主 倒序阅读 楼主  发表于: 2012-02-21
整个的主窗口上有两个QTreeWidget控件  每一个里面有若干父节点和子节点.
现在打算创建一个右键菜单 要求是只有在具体到某一个Item上右击的时候才会弹出右键菜单(在空白区域不行,即使实在控件里的空白区域)
而 两个不同的QTreeWidget所对应的右键菜单是不一样的. 之前看了看contextMenuEvent()函数  还是不太会用
请问怎么实现 是不是涉及到鼠标相关的事件  QCursor::pos 什么的...
恳请大神指教 刚学QT 好多东西都不知道 就查一行一行看帮助文档了...
??
离线gerryleeke

只看该作者 1楼 发表于: 2012-04-11

我也刚接触Qt,我说一下我的做法。
使用信号和槽,自定义槽函数,两个QTreeWidget的话就定义两个,具体到Item则在槽函数里判断,槽函数里再显示菜单。
connect(ui->treeWidget1,SIGNAL(itemPressed(QTreeWidgetItem *, int)),
       this,SLOT(SlotItemClicked(QTreeWidgetItem *, int)));
//槽函数
void MainWindow::SlotItemClicked(QTreeWidgetItem *item, int column)
{
    if (qApp->mouseButtons() == Qt::LeftButton)
    {
        return;
    }
    if (qApp->mouseButtons() == Qt::RightButton)
    {
        if( 1 )  //条件自己加
        {
            showMenu1();
        }
    }
}
//菜单
void MainWindow::showMenu1()
{
    QMenu menu(ui->treeWidget1);
    QAction *add_action =  menu.addAction(tr("打开"));
    QAction *add_remove =  menu.addAction(tr("关闭"));
    menu.exec(QCursor::pos());
}
离线淳于半邪

只看该作者 2楼 发表于: 2012-04-11
你想的没错,确实要用到QCursor::pos
下面是我写过的例子,可供你参考
QModelIndex index = indexAt(e->pos()) ;
    if(!index.isValid())
        return ;
    switch(Layer)
    {
    case 0:
    {
         QMenu pmenu ;
        pmenu.addAction(QPixmap(""),QString::fromLocal8Bit("新建"),this,SLOT(OnNew())) ;
       pmenu.exec(e->globalPos()) ;
    }
    break ;
    case 1:
      {  ...
      }
     break ;
     ...
default:
     break ;
离线童小白

只看该作者 3楼 发表于: 2012-05-26
我确定你是大蒋~
离线XChinux

只看该作者 4楼 发表于: 2012-05-26
customContextMenuRequested ( const QPoint & pos )
先将setContextMenuPolicy(Qt::CustomContextMenu),然后接收上面这个信号。

接下来通过那个pos参数定位当前鼠标在位置的item,然后创建/弹出菜单。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线roywillow

只看该作者 5楼 发表于: 2012-05-26
回 4楼(XChinux) 的帖子
这个信号对于按下键盘的那个关联菜单键(大概是右边ctrl和alt之间的那个键)所返回的pos是个什么情况?
我记得有个朋友尝试去实现,结果总是发现鼠标和键盘调出的右键菜单位置对不上号
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线XChinux

只看该作者 6楼 发表于: 2012-05-26
那就以当前选中项(selectionModel()->selectedIndexes())或者当前项(currentIndex())为准啊
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线roywillow

只看该作者 7楼 发表于: 2012-05-26
回 6楼(XChinux) 的帖子
那么当这个信号发出后,该怎么判断是点击鼠标了呢,还是按了键盘了呢……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
快速回复
限100 字节
 
上一个 下一个