我有一个Draggable继承的抽象类QWidget.其他两个类继承Draggable:
QWidget
|
Draggable (abstract)
/ \
/ \
Class1 Class2
Run Code Online (Sandbox Code Playgroud)
在主窗口中,在鼠标按下事件时,我想知道被点击的孩子是否Draggable:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
QWidget *childWid = childAt(event->pos());
if (!childWid)
return;
// if Draggable is not abstract I can do as below
/*
Dragable *obj = new Dragable;
if (!childWid->metaObject()->inherits(obj->metaObject()))
return;
*/
}
Run Code Online (Sandbox Code Playgroud)
我可以通过比较childWid->metaObject()->className()来检查Class1,Class2但是Draggable有很多孩子.所以我想知道如何判断孩子是否继承了Draggable?
另一种方法是使用qobject_cast函数,它类似于dynamic_cast,但仅适用于QObjects.使用qobject_castvs 的好处dynamic_cast是前者即使禁用RTTI也能工作.
前提条件是你的Draggable类应该QObject直接或间接地继承,它实际上是继承,并用Q_OBJECT宏声明.即
class Draggable : public QWidget
{
Q_OBJECT
[..]
};
Run Code Online (Sandbox Code Playgroud)
在你的例子中:
void MainWindow::mousePressEvent(QMouseEvent *event)
{
QWidget *childWid = childAt(event->pos());
if (!childWid)
return;
// if Draggable is not abstract I can do as below
if (!qobject_cast<Draggable *>(childWid))
{
// Not a Draggable
return;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |