C++ 如何确定qtable单元格中小部件的类型?

C++ 如何确定qtable单元格中小部件的类型?,c++,qt4,C++,Qt4,我已经创建了一个QTable,其中包含许多gui元素,如各种单元格中的组合框和复选框。我可以通过创建指向这些元素的指针来访问它们。我想知道的是,有没有办法知道一个单元格有什么类型的小部件(组合框或复选框) 您可以编写以下实用程序函数: bool IsCheckBox(const QWidget *widget) { return dynamic_cast<const QCheckBox*>(widget) != 0; } bool IsComboBox(const QWidge

我已经创建了一个
QTable
,其中包含许多gui元素,如各种单元格中的
组合框
复选框
。我可以通过创建指向这些元素的指针来访问它们。我想知道的是,有没有办法知道一个单元格有什么类型的
小部件
组合框
复选框

您可以编写以下实用程序函数:

bool IsCheckBox(const QWidget *widget)
{
   return dynamic_cast<const QCheckBox*>(widget) != 0;
}
bool IsComboBox(const QWidget *widget)
{
   return dynamic_cast<const QComboBox*>(widget) != 0;
}
bool-IsCheckBox(const-QWidget*widget)
{
返回动态_cast(小部件)!=0;
}
bool-IsComboBox(const-QWidget*widget)
{
返回动态_cast(小部件)!=0;
}
或者,您可以使用
typeid
来确定单元格中对象的运行时类型

编辑:

正如@Evan在评论中所指出的,您还可以使用来强制转换对象,而不是
dynamic\u cast
。请参阅示例。

查看的答案。接受的答案从小部件中获取类名(作为
const char*
),如下所示:


还有另一个答案建议使用C++的类型管理,但听起来不那么灵活(更难处理?)

您可以使用
QObject::className()
来获取小部件的类型。

我建议使用
QObject\u cast

它的工作原理类似于
dynamic\u cast
,但更好一些,因为它可以做出一些特定于Qt的假设(不依赖于RTTI)

您可以这样使用它:

if(QPushButton *pb = qobject_cast<QPushButton*>(widget)) {
    // it's a "QPushButton", do something with pb here
}
// etc
if(QPushButton*pb=qobject\u cast(小部件)){
//这是一个“QPushButton”,在这里用pb做点什么
}
//等

问题是,由于遍历hirarchy,它很可能会慢得多。@Xeo-什么会使它变慢?智能编译器应该能够优化函数调用,只剩下两个指针的解引用。我指的是
dynamic\u cast
typeid
方法:最好使用
qobject\u cast
。它更快,不依赖于RTTI,并且可以跨库工作。
if(QPushButton *pb = qobject_cast<QPushButton*>(widget)) {
    // it's a "QPushButton", do something with pb here
}
// etc