QT QTreeWidget创建右键菜单,捕获光标位置,父子窗口参数传递,设计属性表

在做属性表的时候,需要父窗口捕获光标位置,并将信息传给子窗口做后续处理。这里遇到了瓶颈,幸运的是最后解决了。方法肯定不止这一种,今天写下来只是希望给大家做个参考。
我的操作对象是TreeWidget控件,但是TableWidget等其他widget控件也可以通过这种思路进行实现。
在这里插入图片描述
QT QTreeWidget创建右键菜单,捕获光标位置,父子窗口参数传递,设计属性表_第1张图片

首先,在含有treewidget的父窗口头文件中声明子窗口类,方便后期对其使用:

#include "menu_attribute.h"

在父窗口类的.h文件中,有以下信号和槽以及其他成员:

signals:
    void trans(QTreeWidgetItem*);

private slots:
    
    void on_treeWidget_customContextMenuRequested(const QPoint &pos);

    void on_treeWidget_itemSelectionChanged();

    void on_attri_menu();

private:
    Ui::xml *ui;
    QMenu *m_pmenu;
    QAction *attri_menu;

    menu_attribute *menu_attri;

下面是在父窗口的.cpp文件中的代码实现。在QMenu类型的右键菜单中添加自定义的QAction,可以设计为“属性”、“新建”、“删除”响应等等。
在设计好右键菜单后,用connect函数把菜单选项的单击响应与自定义槽函数连接,槽函数的功能为show子窗口。
由于属性窗口与treewidget中光标所在位置一一对应,所以还需一个connect将参数由父窗口传给子窗口。

  ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);   //使得该控件可以支持右键菜单
    
  m_pmenu = new QMenu( );	//创建右键菜单QMenu型
    
  attri_menu = m_pmenu->addAction("属性");	//在菜单中添加QAction
  delete_menu = m_pmenu->addAction("删除");
  export_menu = m_pmenu->addAction("输出");
        
  menu_attri = new menu_attribute;   //声明menu_attribute类的对象menu_attri
  connect(attri_menu,SIGNAL(triggered()),this,SLOT(on_attri_menu()));	//将动作attri_menu的点击响应与槽函数(on_attri_menu()连接起来,点击右键菜单的属性选项,跳出对应的属性窗口
   
  connect(this,SIGNAL(trans(QTreeWidgetItem*)), menu_attri,SLOT(tree_info(QTreeWidgetItem*)));
  //将鼠标右键所在位置的Item传递给新窗口

捕获光标位置,并在其所在处显示右键菜单。

void xml::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
    if (ui->treeWidget->itemAt(pos))
    {
        m_pmenu->exec(QCursor::pos()); //光标显示位置
    }
}

子窗口显示出来:

void xml::on_attri_menu()
{
    menu_attri->show();    //显示属性窗口
}

将光标所在处的QTreeWidgetItem参数传递给属性窗口,根据所选Item设计属性信息。

void xml::on_treeWidget_itemSelectionChanged()
{
    QTreeWidgetItem *item = ui->treeWidget->currentItem();   //获取光标所在位置的Item
    emit trans(item);   //将信号安放至槽中发射
        
}

在子窗口menu_attribute类的头文件中声明接收参数的槽函数tree_info,在其.cpp文件中使用item参数对功能进行实现。

public slots:
    void tree_info(QTreeWidgetItem *item); 

你可能感兴趣的:(QT)