Qt键入为函数的参数

问题描述 投票:1回答:1

我正在尝试构建一个函数,它将(qt)Type作为参数并使用它来查找子项。我的功能看起来像这样:

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和其他人是私有的?我是否接触过如何构建错误的函数,或者我只是错误地使用它?还有办法吗?

c++ qt templates types qt4
1个回答
2
投票

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.