【问题标题】:Is it possible to store a QPushButton in a QVariant?是否可以将 QPushButton 存储在 QVariant 中?
【发布时间】:2016-01-29 10:47:50
【问题描述】:

我想知道是否可以将 QPushButton 存储在 QVariant 中。更准确地说,我正在尝试在具有函数setData 的 QStandardItemModel 中使用它。这就是我想做的事情:

QPushButton* button = new QPushButton("Update");
setData(index(0, 0), "Button");
setData(index(0, 1), button);

但显然,它不是那样工作的,所以我尝试了这个:

QVariant variant;
variant.setValue(button);
setData(index(0, 1), QVariant::fromValue(variant));

而且它也不起作用。我想不使用 QTableView(我知道这种视图中有一个 setIndexWidget)。

提前致谢!

【问题讨论】:

  • 为什么需要在模型中存储指向按钮的指针?

标签: qt qpushbutton qvariant


【解决方案1】:

QVariant 需要一个元类型来存储它的类型。 Qt 提供了一组常用类型,但您可以简单地对其进行扩展,使用 Q_DECLARE_METATYPE 宏:

#include <QPushButton>
#include <QVariant>

Q_DECLARE_METATYPE(QPushButton*)

void foo() {
    QPushButton *b1 = new QPushButton("button");
    QVariant v = QVariant::fromValue(b1);
    QPushButton *b2 = qvariant_cast<QPushButton*>(v);
}

注意:如果您想在队列插槽连接或QMetaMethod 中使用自定义元类型,则必须致电qRegisterMetaType&lt;QPushButton*&gt;()

【讨论】:

  • 非常感谢!你知道在那之后我如何显示我的按钮吗? setData 允许我显示 QString 和 QIcon,但我无法以相同的方式检索我的按钮
  • 这取决于您使用的视图,以及您使用哪个角色来设置数据(您的代码使用Qt::EditRole)。我认为 Qt 提供的视图不会处理 QPushButton... 看看 Qt 模型/视图指南:doc.qt.io/qt-5/model-view-programming.html
  • 嗯,这就是我的想法,我想我将不得不采取另一条路......无论如何感谢最初的回答:)
  • @Alexis 如果您只想为视图中的每个条目显示一个按钮并与之交互,您应该考虑为其创建一个委托。您根本无法使用模型的数据来传递对象以使其显示。
【解决方案2】:

您可以这样做,将其存储到QVariant

QVariant v = QVariant::fromValue((void *) button);

并从QVariant检索它:

new_button_pointer = (QPushButton *) v.value<void *>();

记得小心使用!处理这样的指针是非常不安全的

【讨论】:

  • 存储空间没问题,但之后如何显示我的按钮?因为 setData 在参数中采用variant,但我想要我的按钮:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2014-06-09
  • 2014-12-25
  • 2015-05-30
  • 2016-10-21
相关资源
最近更新 更多