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

点中,执行删除操作

未被点中,无反应

相关推荐
道19931 天前
QT 工程中快速实现中英文切换(含动态切换)
命令模式
fpl11161 天前
npm :无法加载文件 D:\...\nodejs\npm.ps1,因为在此系统上禁止运行脚本
前端·vscode·npm·node.js·命令模式
ZouZou老师2 天前
C++设计模式之命令模式:以家具生产为例
c++·设计模式·命令模式
雨中飘荡的记忆7 天前
设计模式之命令模式详解
设计模式·命令模式
小生不才yz7 天前
设计模式 - 命令模式
设计模式·命令模式
开心香辣派小星8 天前
23种设计模式-13命令模式
设计模式·命令模式
太阳以西阿9 天前
【VTK 】 02 锥体旋转起来获取到相机位置
数码相机·命令模式
ZHE|张恒13 天前
设计模式(十八)命令模式 —— 将操作封装成对象,实现撤销、队列等扩展
设计模式·命令模式
q***188415 天前
SpringDoc和Swagger使用
命令模式
明洞日记16 天前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式