【问题标题】:Using Qt::UserRole and Qt::DisplayRole for Items in QComboBox对 QComboBox 中的项目使用 Qt::UserRole 和 Qt::DisplayRole
【发布时间】:2019-03-27 06:29:54
【问题描述】:

我是 C++ Qt 的新手。我正在尝试使用与需要使用的值不同的值填充 QComboBox。 例如,QComboBox 显示设备名称,但在选择时发送该设备的 mac 地址。我有数据。

我尝试使用 Qt::UserRole 和 Qt::DisplayRole 但只使用了 DisplayRole 中提到的值。我想我需要定义角色?如果是,那么如何?对此有何帮助?

QStandardItemModel *model = new QStandardItemModel(this);
int i = 0;
for (auto info : list)
{
    if (info.validateMACAddress())
    {
        memData->comboBox->addItem(info.getMacAddress().arg(i));
        memData->comboBox->setItemData(i, info.getDeviceName(), Qt::DisplayRole);
        memData->comboBox->setItemData(i, info.getMacAddress(), Qt::UserRole + 1);
        i++;
    }
}
memData->comboBox->setModel(model);

【问题讨论】:

  • 你可以解释你的问题是什么。你不知道如何获得MAC吗?删除 memData->comboBox->setModel(model);QStandardItemModel *model = new QStandardItemModel(this);
  • 问题是当我选择设备而不是mac地址时发送设备名称
  • 也就是说,要不要获取连接到QComboBox的slot中的getMacAddress信息?
  • 是的,如果我可以在不更改任何其他代码的情况下做到这一点,那就太好了。
  • 你可以通过currentDatamemData->comboBox->currentData(Qt::UserRole + 1);获取它

标签: c++ qt qt5 qcombobox


【解决方案1】:

QComboBox 有内部模型,无需建立模型。此外,memData->comboBox->setItemData (i, text, Qt::DisplayRole); 等同于 memData->comboBox->addItem(text);,因此只需放置其中一个即可。

int i = 0;
for (auto info : list){
    if (info.validateMACAddress()){
        memData->comboBox->addItem(info.getMacAddress().arg(i));
        memData->comboBox->setItemData(i, info.getMacAddress(), Qt::UserRole + 1);
        i++;
    }
}

要获取 mac,您应该在插槽中使用 currentData() 方法:

// Slot:

auto mac = memData->comboBox->currentData(Qt::UserRole + 1);

【讨论】:

  • 谢谢伙计,所以我在插槽中尝试了这个。我必须为我的代码定义案例并添加参数和其他东西,它起作用了。
【解决方案2】:

您可以使用currentIndexChanged 信号

一种选择是使用 labmda。

connect(memData->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
    [=](int index)
    { 
         // get mac address
         auto oMacAddress = memData->comboBox->itemData(index, Qt::UserRole +1);

    });

或为您的班级添加插槽

 connect(memData->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
        this, &MyClass::HandleIndexChanged);

void MyClass::HandleIndexChanged(int index)
{
  // get mac address
  auto oMacAddress = memData->comboBox->itemData(index, Qt::UserRole +1);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2012-05-29
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多