【问题标题】:Add QMap items in a QListWidget and select the item as active在 QListWidget 中添加 QMap 项目并选择该项目为活动的
【发布时间】:2018-08-03 14:56:23
【问题描述】:

我是 QT 的新手,我正在尝试创建一个 kalk。 可以在 QListWidget 上插入 QMap 对象吗?

我会解释:

我有这个主窗口

在底部有一个 QListWidget,我想做的是在列表中添加我在 costructor 上创建的所有 QMap 对象以及我在添加攻击时创建的对象。

baseWindow.h

#ifndef BASEWINDOW_H
#define BASEWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QGridLayout>
#include <QLineEdit>
#include <QMessageBox>
#include <QTextEdit>
#include <QListWidget>
#include <QPushButton>

class baseWindow : public QWidget
{
    Q_OBJECT
public:
    explicit baseWindow(QWidget *parent = 0);

public slots:

    void changeKalkClicked();
    void addClicked();
    void clearClicked();
    void deleteClicked();
    void itemSelected();
private:

    QPushButton* addButton;
    QPushButton* clearButton;
    QPushButton* deleteButton;
    QLineEdit* displayBA;
    QMap<QString,BaseAttack> storedBA;
    QListWidget* list;

};

basewindow.cpp

baseWindow::baseWindow(QWidget *parent) : QWidget(parent)
{ //Omitted the button/layout/LineEdit creation

   list  = new QListWidget;

   storedBA.insert(tr("Empty"),BaseAttack());
   storedBA.insert(tr("First"),BaseAttack());

   QListWidgetItem* prova = new QListWidgetItem;

   prova->setText(tr("Try"));
   list->addItem(prova);

}

有可能吗?我需要创建从 QMap 到 QListWidget 的连接?

【问题讨论】:

  • 您希望每个项目都有一个 QMap 吗? SIGNAL(itemClicked(QMap*))是什么意思?
  • 不,恰恰相反。我没有解释清楚:我希望所有 Qmap 项都出现在 QListWidget 中(在示例中为“Empty”和“First”项)。因此,在 QListWidget 中构建 Kalk 之后,出现了对象“Empty”和对象“First”。 connect(list, SIGNAL(itemClicked(QMap*)), this, SLOT(itemSelected()));这是一个尝试看看会发生什么(错误)
  • 我还是没看懂,不知道什么是KALK,另一方面signals定义了他们发送的数据类型,不能改,itemClicked发送指向item的指针按下去,你想不到会神奇地发送不同的数据。
  • 我怀疑您有一个预定义的 QMap,其中键必须是项目的文本,而 BaseAttack 的值是您在按下项目时想要获取的值。我是对的?
  • BaseAttack 继承自哪个类?

标签: c++ qt qt5


【解决方案1】:

解决方案很简单,你只需要使用被按下的项目的文本,我们使用 QMap 获取 BaseAttack,但是要以简单的方式工作,BaseAttack 类必须有一个复制构造函数。

*.h

private slots:
    void onItemClicked(QListWidgetItem *item);

*.cpp

    storedBA.insert(tr("Empty"), BaseAttack());
    storedBA.insert(tr("First"), BaseAttack());

    QMapIterator<QString, BaseAttack> i(storedBA);
    while (i.hasNext()) {
        i.next();
        list->addItem(i.key());
    }
    connect(list, &QListWidget::itemClicked, this, &baseWindow::onItemClicked);
}


void baseWindow::onItemClicked(QListWidgetItem *item)
{
    BaseAttack ba = storedBA[item->text()];
}

【讨论】:

  • 谢谢!!!还有两件事,1)你能解释一下这个连接是如何工作的吗? 2)关于Slot函数(baseWindow::onItemClicked(QListWidgetItem *item),赋值是做什么的?你在“ba”上存储storeBA里面是什么?
  • @Dogen 你的意思是connect(list, &amp;QListWidget::itemClicked, this, &amp;baseWindow::onItemClicked);
  • 是的,connect(list, &amp;QListWidget::itemClicked, this, &amp;baseWindow::onItemClicked)
  • @Dogen 我认为您的意思是新语法,因为我看到您使用 SIGNAL 和 SLOT 宏,现在正确的是使用新语法。见wiki.qt.io/New_Signal_Slot_Syntax
  • 好的。在函数baseWindow::onItemClicked(QListWidgetItem *item) 上赋值是做什么的?在“ba”上存储“storeBA”的值是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
相关资源
最近更新 更多