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

点中,执行删除操作

未被点中,无反应

相关推荐
太过平凡的小蚂蚁5 小时前
解耦的艺术:深入理解设计模式之命令模式
设计模式·命令模式
序属秋秋秋3 天前
《Linux系统编程之入门基础》【Linux基础 理论+命令】(上)
linux·运维·服务器·ubuntu·centos·命令模式
路明非1264 天前
QT界面实现2
命令模式
金涛03195 天前
QT-day2,信号和槽
开发语言·qt·命令模式
笨手笨脚の8 天前
设计模式-命令模式
设计模式·命令模式·行为型设计模式
web前端神器10 天前
webpack,vite,node等启动服务时运行一段时间命令窗口就卡住
命令模式·命令
青草地溪水旁12 天前
第十五章:令行禁止,运筹帷幄——Command的命令艺术
命令模式
jh_cao13 天前
(1)SwiftUI 的哲学:声明式 UI vs 命令式 UI
ui·swiftui·命令模式
青草地溪水旁15 天前
第十六章:固本培元,守正出奇——Template Method的模板艺术
命令模式
bkspiderx17 天前
C++设计模式之行为型模式:命令模式(Command)
c++·设计模式·命令模式