Как добавить QAction в QListWidget - PullRequest
0 голосов
/ 26 марта 2020

У меня есть следующий код:

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.

Я знаю, что для запуска действия мне нужно go, чтобы слот называется itemClicked, как я сделал с приведенным выше кодом. На официальной документации я пытался применить то, что советуют, но я не знаю, почему ничего не происходит.

Укажите правильное направление для решения этой проблемы.

1 Ответ

1 голос
/ 26 марта 2020

Посмотрите на вывод консоли, должно появиться предупреждение о сбое подключения. Если вы посмотрите на свой код, причина должна быть довольно очевидной. Рассмотрим

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 действительно вызывается при нажатии пункт. Если нет, значит, вам не хватает подключения соответствующего сигнала из списка, ie. ui->setupUi(this); не имеет этого соединения (другими словами, вы не установили соединение в GUI Designer).

...