如何知道QTabWidget选项卡包含哪些对象类型?

时间:2015-07-09 17:35:46

标签: c++ qt pointers qtabwidget

假设有3个班级Foo1Foo2Foo3。它们是继承QWidget。我现在将每个信息都放在QTabWidget对象中。

QWidget* foo1 = new Foo1();
ui->tbMain->addTab(foo1, "Untitled*");

QWidget* foo2 = new Foo2();
ui->tbMain->addTab(foo2, "Untitled*");

QWidget* foo3 = new Foo3();
ui->tbMain->addTab(foo3, "Untitled*");

现在我选择不同的标签,然后发出一个信号,这个插槽就可以捕获它:

void MainWindow::on_tbMain_currentChanged(int index)
{
     QWidget* widget = ui->tbMain->widget(index);
}

我可以检索当前所选标签中的对象。但我可以将其检索为QWidget,我需要知道它是Foo1Foo2还是Foo3?我怎样才能做到这一点?我会帮助你!

3 个答案:

答案 0 :(得分:1)

您可以使用<%= link_to @habit.user.name, user_path(@habit.user) %>

访问原始班级名称

示例:

->metaObject()->className()

或使用QWidget* foo1 = new Foo1(); qDebug() << foo1->metaObject()->className(); // will print "Foo1" if(QString(foo1->metaObject()->className()) == "Foo1") { Foo1* f1 = qobject_cast<Foo1*>(foo1) } 并检查返回值。

qobject_cast<>

答案 1 :(得分:1)

您可以使用:

void MainWindow::on_tbMain_currentChanged( int index )
{
    QWidget* widget = ui->tbMain->widget( index );

    if ( auto foo1 = dynamic_cast< Foo1* >( widget ) )
    {
        // If the cast is successful it is a Foo1 object. And you call it's functions.
        // ...
    }
    else if ( auto foo2 = dynamic_cast< Foo2* >( widget ) )
    {
        // ...
    }
    else if ( auto foo3 = dynamic_cast< Foo3* >( widget ) )
    {
        // ...
    }
}

但是如果你想要使用的Foo*类有一个共同的属性,那么如果你创建一个FooBase类而不是派生Foo1,它会更优雅。 ..那个类。在这种情况下,您只需要施放一次。

class FooBase : public QWidget
{
public:
    virtual void set( /**/ ) = 0;
};

class Foo1 : public FooBase
{
public:
    virtual void set( /**/ ) { qDebug() << "Foo1::set()"; }
};

然后你可以这样写:

void MainWindow::on_tbMain_currentChanged( int index )
{
    auto foo = dynamic_cast< FooBase* >( ui->tbMain->widget( index ) );
    if ( foo )
    {
        foo->set( /**/ );
    }
}

答案 2 :(得分:0)

您可以使用setObjectName来识别QT中的对象。 它可以使用如下:

QWidget* foo1 = new Foo1();
foo1->setObjectName("Foo1");

要获取对象的标识,您可以使用

QString myObjName = foo1->objectName()