作业

代码
Widget.h
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
// 槽函数
void on_listWidget_itemDoubleClicked(QListWidgetItem *item);
private:
Ui::Widget *ui;
};
#endif
Widget.cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
// 槽函数
void Widget::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
int page = ui->listWidget->row(item);
ui->stackedWidget->setCurrentIndex(page); //跳转相应页面
}
效果


题目
代码
继承QListWidget 重写 其菜单事件
(可以不继承,在Widget中使用菜单事件)
MyListWidget.h
class MyQListWidget : public QListWidget
{
Q_OBJECT
public:
MyQListWidget(QWidget* parent = nullptr);
//菜单事件
virtual void contextMenuEvent(QContextMenuEvent *event) override;
public slots:
void on_action_triggered();
private:
QMenu* menu;
QListWidgetItem* item_clicked;
};
#endif
MyListWidget.cpp
MyQListWidget::MyQListWidget(QWidget *parent)
:QListWidget(parent)
{
menu = new QMenu(this); //创建menu
QAction* del_action =menu->addAction("删除"); //创建action
QObject::connect(del_action,&QAction::triggered,this,&MyQListWidget::on_action_triggered);
}
void MyQListWidget::contextMenuEvent(QContextMenuEvent *event)
{
item_clicked=itemAt(event->pos()); //判断触发菜单事件时,鼠标位置是否有item
if(item_clicked != nullptr) //鼠标位置有item
{
qDebug() << "点中了item";
menu->exec(event->globalPos()); //显示菜单
}
}
void MyQListWidget::on_action_triggered()
{
qDebug() << "执行删除操作";
int row = this->row(item_clicked); //被点击的item在listWidget中是第几个
this->takeItem(row); //删除该item
}
效果
/*************************************************分割线*************************************************/
作业

思路
继承listWidget,重写其"鼠标点击"事件,创建menu
代码
重载后的MylistWidget.h
class MyQListWidget : public QListWidget
{
Q_OBJECT
public:
MyQListWidget(QWidget* parent = nullptr);
virtual void mousePressEvent(QMouseEvent *event) override;
private:
QMenu* menu;
};
#endif
MylistWidget.cpp
MyQListWidget::MyQListWidget(QWidget *parent)
:QListWidget(parent)
{
menu = new QMenu(this); //创建menu
QAction* del_action =menu->addAction("删除"); //创建action
menu->triggered(del_action); //添加监视
//设定触发信号所连接的槽函数
QObject::connect(del_action,&QAction::triggered,this,&MyQListWidget::on_action_triggered);
}
void MyQListWidget::mousePressEvent(QMouseEvent *event)
{
//运行到此说明鼠标按下
//如果"鼠标右键"按下
if (event->button() == Qt::RightButton)
{
//判断"鼠标右键"位置是否有item
if (itemAt(event->pos()) != nullptr)
{
qDebug() << "鼠标右键单击一次";
menu->exec(event->globalPos()); //显示 示例中QMouseEvent
menu_open_flag=1;
}
}
}
void MyQListWidget::on_action_triggered()
{
qDebug() << "执行删除操作";
}
效果
右键点中item , 弹出menu

点中,执行删除操作

未被点中,无反应
