使自定义 QWidget 可选

Posted

技术标签:

【中文标题】使自定义 QWidget 可选【英文标题】:make Custom QWidget selectable 【发布时间】:2013-06-06 12:07:15 【问题描述】:

我正在开发一款棋盘游戏,并试图让 QWidgets(矩形)可选择。 所以我有一个 BoardView(继承自 QWidget),其中包含 BuildingViews、PlantationViews(都继承自 QWidget)。这一切都显示在窗口上,但不可点击。我怎样才能使它可点击?

【问题讨论】:

您是否尝试用鼠标移动这些小部件?您可以覆盖鼠标事件来移动小部件,但我不得不问,您为什么使用QWidgets 而不是QGraphicsItems? 我的教授说 QWidgets 是可以使用的。我不会切换到 QGraphicsItems。我不想移动这些小部件,只是选择它们。 所有 QWidget 都是可点击的。我认为你的问题措辞很糟糕。你尝试过什么,你想要什么? 我想保存最后点击(选择)的 QWidget,以便稍后在函数中传递。 【参考方案1】:

您可以尝试在小部件 ID 被转发的地方创建一个 QMouseEvent 实现, 像这样:

在小部件的实现中(例如 YourWidget.cpp):

YourWidget::MouseReleaseEvent(QMouseEvent *event)

     emit clickedWithMouse(this);    // this is a signal, declared in YourWidget.h

在“主”游戏文件(例如 Game.cpp)中:

Game::onButtonClicked(YourWidget* widget)    // this is a public slot, you must connect all YourWidgets's clickedWithMouse signals to this slot (in Game object code, e.g. when initialising the board)

    lastWidget = widget; //save the widget "ID" (lastWidget is a member of class Game)
    someFunction(widget); //do something with the widget (if you wish)

【讨论】:

以上是关于使自定义 QWidget 可选的主要内容,如果未能解决你的问题,请参考以下文章

使自定义容器可迭代

如何使自定义对象可迭代?

使自定义viewcontroller覆盖导航栏

使自定义 Airflow 宏扩展其他宏

如何使自定义 UIView 可访问?

使自定义 .NET 异常可序列化的正确方法是啥?