假设有3个班级Foo1
,Foo2
和Foo3
。它们是继承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
,我需要知道它是Foo1
,Foo2
还是Foo3
?我怎样才能做到这一点?我会帮助你!
答案 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()