【问题标题】:Qt Type as parameter of functionQt 类型作为函数的参数
【发布时间】:2018-06-09 22:39:17
【问题描述】:

我正在尝试构建一个将 (qt) 类型作为参数并使用它来查找子级的函数。我的函数如下所示:

template <typename QType>
void MyClass::activateElements(QWidget *widget, QType t)
{
    QList<QType *> buttons = widget->findChildren(t);
    foreach( QType *button, buttons )
    {
        buttons->setEnabled(true);
    }
}

我也试过

template <typename QType>
void MyClass::activateElements(QWidget *widget, QType)
{
    QList<QType *> buttons = (* widget).findChildren<QType *>();
    foreach( QType *button, buttons )
    {
        button->setEnabled(true);
    }
}

我在另一个类中实例化了一个使用该函数的类的对象。在那里我尝试像这样使用它:

    QDoubleSpinBox x;
    object_of_my_class->activateElements(correctWidget, x);

此时我卡住了,因为我收到以下错误:

error: ‘QDoubleSpinBox::QDoubleSpinBox(const QDoubleSpinBox&)’ is private Q_DISABLE_COPY(QDoubleSpinBox)

我将如何处理这个问题,QDoubleSpinBox 和其他人是私有的?我是否接近过如何错误地构建功能,或者我只是使用不正确?有没有办法做到这一点?

【问题讨论】:

  • "我将如何处理这个问题,QDoubleSpinBox 和其他人是私有的?" 错误指出 QDoubleSpinBoxcopy-constructor 是私人(即不能复制)。按引用传递而不是按值传递。

标签: c++ qt templates types qt4


【解决方案1】:

看起来你根本不需要类型的对象,只需要类型本身。在这种情况下,指定模板参数将是可行的方法:

template <typename QType>
void MyClass::activateElements(QWidget *widget)
{
    QList<QType *> buttons = (* widget).findChildren<QType *>();
    foreach( QType *button, buttons )
    {
        button->setEnabled(true);
    }
}

// Usage:
object_of_my_class->activateElements<QDoubleSpinBox>(correctWidget);

这就是我的做法,因为它很好地表达了意图。

但是,如果您真的想要从现有对象中启用类型推断,请通过引用传递它以避免(被禁止的)复制:

template <typename QType>
void MyClass::activateElements(QWidget *widget, const QType &)
{
    QList<QType *> buttons = (* widget).findChildren<QType *>();
    foreach( QType *button, buttons )
    {
        button->setEnabled(true);
    }
}

// Usage:
QDoubleSpinBox x;
object_of_my_class->activateElements(correctWidget, x);

【讨论】:

  • 非常感谢!第一种方法确实似乎是更好的选择。我早些时候在那里,但一定搞砸了函数调用然后迷路了。再次使用它,我得到“对void MyClass::activateElements&lt;QDoubleSpinBox&gt;(QWidget*) 的未定义引用。我在头文件中将其定义为template &lt;typename QType&gt; void activateElements(QWidget *widget);。这是我的错误吗?
  • @Shin 您是否在此处定义它(包括正文),或者只是在此处声明它(并将其实现放入.cpp文件)?只有前者可以工作:见Why can templates only be implemented in the header file?
  • 我不知道该函数也必须在header fie 中定义。这样做了,现在终于可以正常工作了。非常感谢您的帮助:)
  • @Shin 澄清一点:函数不必,函数模板可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 2021-03-29
相关资源
最近更新 更多