首页 > 解决方案 > 如何将 QAction 添加到 QListWidget

问题描述

我有以下代码:

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);
}

到目前为止我做了什么:

我遇到了这篇文章这篇文章。非常有用,因为我以非常相似的方式设置了我的项目,但是当我尝试单击QListWidget.

我知道,为了触发动作,我必须itemClicked像在上面提供的代码中那样调用插槽。在官方文档中,我试图应用建议的内容,但我不知道为什么什么也没发生。

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

标签: qtc++11qt5qlistwidgetqaction

解决方案


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

SLOT(createItemFromAction(QListWidgetItem*))

与您甚至不是插槽的方法相比

QListWidgetItem *createItemFromAction(const QAction* action);

看到不同?


然后你有这个插槽:

void on_listWidget_itemClicked(QListWidgetItem *item);

您试图将其用作信号

SIGNAL(on_listWidget_itemClicked(QListWidgetItem*))

那显然行不通。


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

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


推荐阅读