QT 作业 day4

作业

代码

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

点中,执行删除操作

未被点中,无反应

相关推荐
ZHE|张恒3 小时前
设计模式(十八)命令模式 —— 将操作封装成对象,实现撤销、队列等扩展
设计模式·命令模式
q***18842 天前
SpringDoc和Swagger使用
命令模式
明洞日记3 天前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式
阿波罗尼亚8 天前
Head First设计模式(六) 设计原则 命令模式
设计模式·命令模式
共享家952710 天前
QT-系统(文件)
开发语言·qt·命令模式
iFlow_AI13 天前
增强AI编程助手效能:使用开源Litho(deepwiki-rs)深度上下文赋能iFlow
人工智能·ai·ai编程·命令模式·iflow·iflow cli·心流ai助手
o0向阳而生0o16 天前
112、23种设计模式之命令模式(20/23)
设计模式·命令模式
郝学胜-神的一滴1 个月前
深入解析C++命令模式:设计原理与实际应用
开发语言·c++·程序人生·软件工程·命令模式
紫荆鱼1 个月前
设计模式-命令模式(Command)
c++·后端·设计模式·命令模式
杯莫停丶1 个月前
设计模式之:命令模式
设计模式·命令模式·1024程序员节·活动勋章