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

点中,执行删除操作

未被点中,无反应

相关推荐
前端开发与ui设计的老司机1 天前
数字孪生技术为UI前端注入灵魂:实现产品全生命周期的可视化管理
前端·ui·命令模式
勤奋的知更鸟12 天前
Java 编程之命令模式
java·开发语言·设计模式·命令模式
charlie11451419112 天前
从C++编程入手设计模式——命令模式
c++·设计模式·命令模式
范纹杉想快点毕业14 天前
Qt构造函数详解:布局与快捷键实战
c语言·开发语言·数据库·c++·qt·命令模式
wulitoud14 天前
vim 编辑模式/命令模式/视图模式常用命令
vim·excel·命令模式
范纹杉想快点毕业15 天前
解析Qt文件保存功能实现
java·开发语言·c++·算法·命令模式
码农颜19 天前
java 设计模式_行为型_19命令模式
java·设计模式·命令模式
qqxhb24 天前
零基础设计模式——行为型模式 - 命令模式
java·设计模式·go·命令模式
牛奶咖啡131 个月前
学习设计模式《十二》——命令模式
学习·设计模式·命令模式·队列请求·宏命令·可撤销恢复操作·参数化配置
熙客1 个月前
行为型:命令模式
命令模式