请教关于QTreeWidget的若干问题

时间:2022-09-05 18:48:07
1、如何为QTreeWidget添加右键菜单?要求右击部分节点后会弹出这个菜单。
2、节点移动功能已实现,但有部分节点不允许拖动后成为根节点,请问该如何实现?
3、如何让QTreeWidget实现:按Ctrl+z后Undo,按Ctrl+r后Redo?比如说:撤销或重做节点的重命名。

12 个解决方案

#1


1,创建QMenu然后,itemClicked信号对应写个槽实现菜单弹出。
2,设置为根节点,对应的属性设置为不可移动。
3,第三个没有遇到,可能要捕捉键盘消息。作处理。QTreeWidgetItem。

#2


1:我要求的是右击后才弹出菜单。如果用itemClicked的话好像左击也会弹出菜单,那就不符合要求了
2:把什么对象设置为根节点?把什么属性设为不可移动?我找了很久,发现不容易找到:

#3


设置role

响应键盘事件

#4


1:应该不那么简单,我试过好几种方法了,楼上说的、SIGNAL(customContextMenuRequested(const QPoint&))……都没成功。理论上可以写控件的派生类然后用contextMenuEvent()来实现,问题是我的界面整体比较复杂,这样做会加大界面设计的难度。

#5


void QTreeView::mousePressEvent ( QMouseEvent * event ) 
{
 if(event->button() == Qt::RightButton)
{
 弹出菜单;
}
}

Undo系统麻烦一些,查查资料如果有再来

#6


如果用楼上的方法,岂不是要写QTreeView的派生类了吗?
我的界面比较复杂,这样做会大大增加界面设计的难度。

#7


不用派生,此函数是QTreeView的虚函数,只需在.h中声明,.cpp中重写一下即可

#8


瞎说了一句,==,我测试一个方法如果好了再说

#9


用Creater生成一个工程,只拉一个QTreeView到QWidget上
在.H中声明Action变量:
    private:
    Ui::Widget *ui;
    QAction *copy;//示例菜单项一
    QAction *cut; //示例菜单项二
在.CPP文件的构造函数:
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    copy = new QAction("Copy", ui->treeView); //初始化
    cut = new QAction("Cut", ui->treeView);
    //这里可以连接信号...
    ui->treeView->addAction(copy); //给QTreeView的对象添加Action
    ui->treeView->addAction(cut);
    ui->treeView->setContextMenuPolicy(Qt::ActionsContextMenu);//设置右键菜单
}

OK了,经过测试,完全满足你的要求:在QTreeView上右击鼠标,就弹出有Copy和Cut两项内容的菜单

#10


跟着学习下!

#11


to 7楼:

不用派生,此函数是QTreeView的虚函数,只需在.h中声明,.cpp中重写一下即可

怎样重写?举个最最基本的例子给我就行了。

还有,我要的是当且仅当右击指定的节点时弹出菜单,而不是随便右击树形控件的某个地方就弹出菜单。用mousePressEvent能实现吗?

#12


不知楼主后来撤销undo操作做得如何了?可否让我借鉴一下?

#1


1,创建QMenu然后,itemClicked信号对应写个槽实现菜单弹出。
2,设置为根节点,对应的属性设置为不可移动。
3,第三个没有遇到,可能要捕捉键盘消息。作处理。QTreeWidgetItem。

#2


1:我要求的是右击后才弹出菜单。如果用itemClicked的话好像左击也会弹出菜单,那就不符合要求了
2:把什么对象设置为根节点?把什么属性设为不可移动?我找了很久,发现不容易找到:

#3


设置role

响应键盘事件

#4


1:应该不那么简单,我试过好几种方法了,楼上说的、SIGNAL(customContextMenuRequested(const QPoint&))……都没成功。理论上可以写控件的派生类然后用contextMenuEvent()来实现,问题是我的界面整体比较复杂,这样做会加大界面设计的难度。

#5


void QTreeView::mousePressEvent ( QMouseEvent * event ) 
{
 if(event->button() == Qt::RightButton)
{
 弹出菜单;
}
}

Undo系统麻烦一些,查查资料如果有再来

#6


如果用楼上的方法,岂不是要写QTreeView的派生类了吗?
我的界面比较复杂,这样做会大大增加界面设计的难度。

#7


不用派生,此函数是QTreeView的虚函数,只需在.h中声明,.cpp中重写一下即可

#8


瞎说了一句,==,我测试一个方法如果好了再说

#9


用Creater生成一个工程,只拉一个QTreeView到QWidget上
在.H中声明Action变量:
    private:
    Ui::Widget *ui;
    QAction *copy;//示例菜单项一
    QAction *cut; //示例菜单项二
在.CPP文件的构造函数:
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    copy = new QAction("Copy", ui->treeView); //初始化
    cut = new QAction("Cut", ui->treeView);
    //这里可以连接信号...
    ui->treeView->addAction(copy); //给QTreeView的对象添加Action
    ui->treeView->addAction(cut);
    ui->treeView->setContextMenuPolicy(Qt::ActionsContextMenu);//设置右键菜单
}

OK了,经过测试,完全满足你的要求:在QTreeView上右击鼠标,就弹出有Copy和Cut两项内容的菜单

#10


跟着学习下!

#11


to 7楼:

不用派生,此函数是QTreeView的虚函数,只需在.h中声明,.cpp中重写一下即可

怎样重写?举个最最基本的例子给我就行了。

还有,我要的是当且仅当右击指定的节点时弹出菜单,而不是随便右击树形控件的某个地方就弹出菜单。用mousePressEvent能实现吗?

#12


不知楼主后来撤销undo操作做得如何了?可否让我借鉴一下?