在做属性表的时候,需要父窗口捕获光标位置,并将信息传给子窗口做后续处理。这里遇到了瓶颈,幸运的是最后解决了。方法肯定不止这一种,今天写下来只是希望给大家做个参考。
我的操作对象是TreeWidget控件,但是TableWidget等其他widget控件也可以通过这种思路进行实现。
首先,在含有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);