QStateMachine如何在不同的QState中显示和隐藏QGraphicsView和QObject
QStateMachine how to show and hide QGraphicsView and QObject in different QState
这是我的简单代码:
我创建了一个新的 scene
、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();
我想在 s1
中显示 view
并设置 object1
可见。
在场景上单击鼠标,我已将过渡添加到 s2
。
在s2
我只想隐藏object1
.
我该怎么做?有人可以帮我做一个小教程吗?
我正在使用 Qt 5.6.0 和 MinGW 4.9.2 32 位。
每个 QState
都有 entered
和 exited
信号,您可以将仿函数连接到这些信号。这是现代 Qt 5 代码中的常见习惯用法。可以使用 lambda 表达式简洁地给出仿函数,您可以在其中对非对象调用任意操作,例如 QPixmapItem
。如果 QPixmapItem
从 QGraphicsObject
派生,您可以使用 QState::assignProperty
分配所需的可见性状态,而不是调用 show()
和 hide()
.
下面是一个完整的例子。
// https://github.com/KubaO/Whosebugn/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();
}
这是我的简单代码:
我创建了一个新的 scene
、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();
我想在
s1
中显示view
并设置object1
可见。在场景上单击鼠标,我已将过渡添加到
s2
。在
s2
我只想隐藏object1
.
我该怎么做?有人可以帮我做一个小教程吗?
我正在使用 Qt 5.6.0 和 MinGW 4.9.2 32 位。
每个 QState
都有 entered
和 exited
信号,您可以将仿函数连接到这些信号。这是现代 Qt 5 代码中的常见习惯用法。可以使用 lambda 表达式简洁地给出仿函数,您可以在其中对非对象调用任意操作,例如 QPixmapItem
。如果 QPixmapItem
从 QGraphicsObject
派生,您可以使用 QState::assignProperty
分配所需的可见性状态,而不是调用 show()
和 hide()
.
下面是一个完整的例子。
// https://github.com/KubaO/Whosebugn/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();
}