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

点中,执行删除操作

未被点中,无反应

相关推荐
m0_555762905 天前
不在 qtdesigner中提升,进行主题程序设计
qt·命令模式
秋风&萧瑟10 天前
【QT】练习1
开发语言·qt·命令模式
LoveXming14 天前
Qt 多线程的两种实现方式
开发语言·qt·命令模式
懒大王爱吃狼15 天前
heapq库的使用——python代码
开发语言·数据库·python·mysql·命令模式
Antonio91518 天前
【设计模式】命令模式
设计模式·命令模式
Antonio91518 天前
【Q&A】Qt中有哪些命令模式的运用?
开发语言·qt·命令模式
wenbin_java18 天前
设计模式之命令模式:原理、实现与应用
设计模式·命令模式
laimaxgg21 天前
Qt窗口控件之颜色对话框QColorDialog
开发语言·前端·c++·qt·命令模式·qt6.3
"_rainbow_"23 天前
Qt按钮控件常用的API
qt·命令模式
懒大王爱吃狼25 天前
Python + Qt Designer构建多界面GUI应用程序:Python如何调用多个界面文件
开发语言·数据库·python·qt·mysql·python基础·命令模式