如何将 QAction 添加到 QListWidget

Posted

技术标签:

【中文标题】如何将 QAction 添加到 QListWidget【英文标题】:How to add a QAction to a QListWidget 【发布时间】:2020-03-25 22:24:29 【问题描述】:

我有以下代码:

roslaserscandoialog.h

public:
    explicit ROSLaserScanDialog(QWidget *parent = nullptr);
    ~ROSLaserScanDialog();
    QListWidgetItem *createItemFromAction(const QAction* action);

private slots:
    void on_listWidget_itemClicked(QListWidgetItem *item);

private:
    Ui::ROSLaserScanDialog *ui;
    QAction *mAddMsgs;
    QAction *mDeleteMsgs;

roslaserscandoialog.cpp

ROSLaserScanDialog::ROSLaserScanDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ROSLaserScanDialog)

    ui->setupUi(this);
    connect(ui->listWidget,SIGNAL(on_listWidget_itemClicked(QListWidgetItem*)),this,SLOT(createItemFromAction(QListWidgetItem*)));




QListWidgetItem *ROSLaserScanDialog::createItemFromAction(const QAction *action)

    Q_ASSERT( action );
    QListWidgetItem *mAddMsgs = new QListWidgetItem();
    mAddMsgs->setText( action->text() );
    mAddMsgs->setToolTip( action->toolTip() );
    mAddMsgs->setIcon( action->icon() );
    // ...
    return mAddMsgs;


void ROSLaserScanDialog::on_listWidget_itemClicked(QListWidgetItem *item)

    mAddMsgs = new QAction(QIcon(":ros.png"), tr("Add New Message"), this);
    mDeleteMsgs = new QAction(QIcon(":remove_item.png"), tr("Remove Message"), this);

到目前为止我做了什么:

我遇到了this post 和this one。非常有用,因为我以非常相似的方式设置我的项目,但是当我尝试点击 QListWidget 时没有任何反应。

我知道,为了触发操作,我必须转到名为 itemClicked 的插槽,就像我在上面提供的代码中所做的那样。 在official documentation 上,我试图应用建议的内容,但我不知道为什么什么也没发生。

请指出解决这个问题的正确方向。

【问题讨论】:

【参考方案1】:

查看控制台输出,应该有关于连接失败的警告。如果您查看代码,原因应该很明显。考虑

SLOT(createItemFromAction(QListWidgetItem*))

与你的方法相比,它甚至不是一个插槽

QListWidgetItem *createItemFromAction(const QAction* action);

看到区别了吗?


然后你就有了这个插槽:

void on_listWidget_itemClicked(QListWidgetItem *item);

您试图将其用作信号

SIGNAL(on_listWidget_itemClicked(QListWidgetItem*))

这显然行不通。


有点不清楚当一个项目被点击时你想要发生什么,但也许你应该直接从on_listWidget_itemClicked 调用createItemFromAction

此外,添加调试打印或使用断点来验证单击项目时是否实际调用了on_listWidget_itemClicked。如果没有,那么您缺少连接列表视图中的相关信号,即。 ui->setupUi(this); 没有那个连接(换句话说,您没有在 GUI 设计器中进行连接)。

【讨论】:

非常感谢您阅读这个问题:) 这正是问题所在。现在可以了。我不得不直接从on_listWidget_itemClickedAlso 拨打createItemFromAction。我不明白为什么有人对这个问题投了反对票。我花了一些时间从代码中提取最重要的信息部分,并尝试以一种可以理解的方式提出问题。 您非常好,感谢您抽出宝贵时间回答问题! :) @Emanuele 没问题。在您了解整个 Qt GUI 的工作原理之前,您需要花费一些时间和一些练习。作为最后一条相关建议,今天你不应该使用SIGNALSLOT 宏,除非你真的因为某种原因需要,而是使用新的带有函数指针的语法(参见this 的例子)。 :) 谢谢!!

以上是关于如何将 QAction 添加到 QListWidget的主要内容,如果未能解决你的问题,请参考以下文章

如果 QMenu 是 unique_ptr,为啥 QAction 不添加到 QMenu?

Qt 中QAction用addAction添加到QToolbar不能显示怎么破

QT:QActionGroup加入QMenu后,谁是QActionGroup成员的父母?

QAction 父菜单

将分隔符添加到 QTableView 的操作?

通过 QtGui.QAction 将参数传递给触发的方法