c++ - QStateMachine如何在不同的QState中显示和隐藏QGraphicsView和QObject

标签 c++ qt qt5 qgraphicsscene qstatemachine

这是我的简单代码:

我创建了一个新的场景 View QPixmapItem

QGraphicsScene *scena = new QGraphicsScene();
QGraphicsPixmapItem *object1= new QGraphicsPixmapItem();
object1->setPixmap(QPixmap(":/prova/prova.png"));

QGraphicsView *view = new QGraphicsView();

view->setScene(scena);
scena->addItem(object1);

view->show();

接下来我用两个 QState

创建了一个新的 QStateMachine
QStateMachine *machine = new QStateMachine();
QState *s1 = new QState();
QState *s2 = new QState();

machine -> addState(s1);
machine -> addState(s2);

//mouse click in a void mousePressEvent
s1 -> addTransition(this,SIGNAL(mouseclick()),s2);

machine -> start();
  1. 我想在 s1 中显示 view 并设置 object1 可见。

  2. 通过在场景上单击鼠标,我已将过渡添加到 s2

  3. s2 中,我只想隐藏 object1

我该怎么做?有人可以帮我做一个小教程吗?

我正在使用 Qt 5.6.0 和 MinGW 4.9.2 32 位。

最佳答案

每个 QState 都有 enteredexited 信号,您可以将仿函数连接到这些信号。这是现代 Qt 5 代码中的常见习惯用法。仿函数可以使用 lambda 表达式简洁地给出,您可以在非对象上调用任意操作,例如在 QPixmapItem 上。如果 QPixmapItem 派生自 QGraphicsObject,您可以使用 QState::assignProperty 来分配所需的可见性状态,而不是调用 show()hide()

下面是一个完整的例子。

// https://github.com/KubaO/stackoverflown/tree/master/questions/scenestate-37684315
#include <QtWidgets>

void addTransition(QState * src, QObject * eventSource, QEvent::Type type, QAbstractState * dst)
{
   auto transition = new QEventTransition(eventSource, type);
   transition->setTargetState(dst);
   src->addTransition(transition);
}

struct Window : public QWidget {
   QHBoxLayout m_layout{this};
   QGraphicsScene m_scene;
   QGraphicsPixmapItem m_item;
   QGraphicsView m_view{&m_scene};

   QStateMachine m_mach;
   QState s1{&m_mach};
   QState s2{&m_mach};
   Window() {
      m_layout.addWidget(&m_view);
      QPixmap pix{128, 128};
      QPainter p{&pix};
      p.setBrush(Qt::white);
      p.drawRect(pix.rect().adjusted(0,0,-1,-1));
      p.drawText(pix.rect(), "Hello");
      m_item.setPixmap(pix);
      m_scene.addItem(&m_item);

      // I want to show the view in s1...
      s1.assignProperty(&m_view, "visible", true);
      // and set object1 visible.
      s1.connect(&s1, &QState::entered, [&]{ m_item.show(); });
      // With a mouse click on the scene I've added a transition to s2.
      addTransition(&s1, &m_view, QEvent::MouseButtonPress, &s2);
      // In s2 I want to hide only object1.
      s2.connect(&s2, &QState::entered, [&]{ m_item.hide(); });
      m_mach.setInitialState(&s1);
      m_mach.start();
   }
};

int main(int argc, char ** argv) {
   QApplication app{argc, argv};
   Window w;
   w.show();
   return app.exec();
}

关于c++ - QStateMachine如何在不同的QState中显示和隐藏QGraphicsView和QObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37684315/

相关文章:

c++ - 从 QByteArray 使用 libjpeg 加载 jpeg 图像纹理

c++ - 在 Qt5 中发送 JSON 文件的 POST 请求

c++ - 使用 QStringList::entryList() 时对 QStringList 进行反向排序

c++ - C程序读取2个字符串之间的数据

c++ - 模板和多态有什么区别

c++ - 通过 getter 获取时在其他类中声明结构变量

c++ - Qt QTextDocument 新行?

c++ - QML 指针处理程序和处理抓取更改

c++ - 关于内存地址的问题

c++ - C - 对双变量求和会根据其编写方式给出不同的输出