This gist was moved to:
https://github.com/EXL/Stuff/tree/master/Examples/Qt-PushMe
This gist was moved to:
https://github.com/EXL/Stuff/tree/master/Examples/Qt-PushMe
| #include "Widget.h" | |
| #include <QApplication> | |
| #include <QTranslator> | |
| #include <QLocale> | |
| #include <ctime> | |
| int main(int argc, char *argv[]) | |
| { | |
| QApplication a(argc, argv); | |
| qsrand(time(0)); | |
| QTranslator appTranslator; | |
| appTranslator.load("PushMe_" + QLocale::system().name(), "://"); | |
| a.installTranslator(&appTranslator); | |
| Widget w; | |
| w.show(); | |
| return a.exec(); | |
| } |
| #------------------------------------------------- | |
| # | |
| # Project created by QtCreator 2014-07-29T21:37:03 | |
| # | |
| #------------------------------------------------- | |
| QT += core gui | |
| greaterThan(QT_MAJOR_VERSION, 4): QT += widgets | |
| TARGET = PushMe | |
| TEMPLATE = app | |
| SOURCES += main.cpp\ | |
| Widget.cpp | |
| HEADERS += Widget.h | |
| FORMS += Widget.ui | |
| TRANSLATIONS += PushMe_en.ts \ | |
| PushMe_ru.ts \ | |
| PushMe_es.ts | |
| RESOURCES += \ | |
| PushMe.qrc |
| <RCC> | |
| <qresource prefix="/"> | |
| <file>PushMe_es.qm</file> | |
| <file>PushMe_ru.qm</file> | |
| <file>PushMe_en.qm</file> | |
| </qresource> | |
| </RCC> |
| <?xml version="1.0" encoding="utf-8"?> | |
| <!DOCTYPE TS> | |
| <TS version="2.1" language="en_US"> | |
| <context> | |
| <name>Widget</name> | |
| <message> | |
| <location filename="Widget.ui" line="14"/> | |
| <location filename="Widget.ui" line="26"/> | |
| <source>Push Me!</source> | |
| <translation>Push Me!</translation> | |
| </message> | |
| <message> | |
| <location filename="Widget.cpp" line="101"/> | |
| <source>Win!</source> | |
| <translation>Win!</translation> | |
| </message> | |
| <message> | |
| <location filename="Widget.cpp" line="101"/> | |
| <source>Oh Yeah! You win!</source> | |
| <translation>Oh Yeah! You win!</translation> | |
| </message> | |
| </context> | |
| </TS> |
| <?xml version="1.0" encoding="utf-8"?> | |
| <!DOCTYPE TS> | |
| <TS version="2.1" language="es_ES"> | |
| <context> | |
| <name>Widget</name> | |
| <message> | |
| <location filename="Widget.ui" line="14"/> | |
| <location filename="Widget.ui" line="26"/> | |
| <source>Push Me!</source> | |
| <translation>Push Me!</translation> | |
| </message> | |
| <message> | |
| <location filename="Widget.cpp" line="101"/> | |
| <source>Win!</source> | |
| <translation>¡Victoria!</translation> | |
| </message> | |
| <message> | |
| <location filename="Widget.cpp" line="101"/> | |
| <source>Oh Yeah! You win!</source> | |
| <translation>Oh sí! Usted gana!</translation> | |
| </message> | |
| </context> | |
| </TS> |
| <?xml version="1.0" encoding="utf-8"?> | |
| <!DOCTYPE TS> | |
| <TS version="2.1" language="ru_RU"> | |
| <context> | |
| <name>Widget</name> | |
| <message> | |
| <location filename="Widget.ui" line="14"/> | |
| <location filename="Widget.ui" line="26"/> | |
| <source>Push Me!</source> | |
| <translation>Нажми меня!</translation> | |
| </message> | |
| <message> | |
| <location filename="Widget.cpp" line="101"/> | |
| <source>Win!</source> | |
| <translation>Победа!</translation> | |
| </message> | |
| <message> | |
| <location filename="Widget.cpp" line="101"/> | |
| <source>Oh Yeah! You win!</source> | |
| <translation>О да! Вы выиграли!</translation> | |
| </message> | |
| </context> | |
| </TS> |
| #include "Widget.h" | |
| #include "ui_Widget.h" | |
| #include <QCursor> | |
| #include <QMessageBox> | |
| Widget::Widget(QWidget *parent) : | |
| QWidget(parent), | |
| ui(new Ui::Widget) | |
| { | |
| ui->setupUi(this); | |
| ui->pushButton->installEventFilter(this); | |
| startTimer(10); | |
| } | |
| void Widget::timerEvent(QTimerEvent *) | |
| { | |
| if (buttonCoords().contains(QCursor::pos())) { | |
| moveButton(); | |
| } | |
| } | |
| bool Widget::eventFilter(QObject *obj, QEvent *event) | |
| { | |
| if (obj == ui->pushButton) { | |
| if (event->type() == QEvent::KeyPress) { | |
| return true; | |
| } | |
| } | |
| return QWidget::eventFilter(obj, event); | |
| } | |
| QRect Widget::buttonCoords() const | |
| { | |
| QPoint globalCoords = ui->pushButton->mapToGlobal(QPoint(0,0)); | |
| int x = globalCoords.x(); | |
| int y = globalCoords.y(); | |
| QPoint lastCorner; | |
| lastCorner.setX(x + ui->pushButton->width()); | |
| lastCorner.setY(y + ui->pushButton->height()); | |
| return QRect(globalCoords, lastCorner); | |
| } | |
| void Widget::moveButton() | |
| { | |
| ui->pushButton->move(generateValidPoint()); | |
| } | |
| QPoint Widget::generateValidPoint() const | |
| { | |
| int eps = 5; | |
| int x = ui->pushButton->pos().x(); | |
| int y = ui->pushButton->pos().y(); | |
| if (buttonCoords().center().x() < QCursor::pos().x()) { | |
| x = qrand() % eps - ui->pushButton->width() / 4 + ui->pushButton->pos().x(); | |
| } | |
| if (buttonCoords().center().y() < QCursor::pos().y()) { | |
| y = qrand() % eps - ui->pushButton->height() / 2 + ui->pushButton->pos().y(); | |
| } | |
| if (buttonCoords().center().x() >= QCursor::pos().x()) { | |
| x = qrand() % eps + ui->pushButton->width() / 4 + ui->pushButton->pos().x(); | |
| } | |
| if (buttonCoords().center().y() >= QCursor::pos().y()) { | |
| y = qrand() % eps + ui->pushButton->height() / 2 + ui->pushButton->pos().y(); | |
| } | |
| if (!rect().contains(QRect(x, y, ui->pushButton->width(), ui->pushButton->height()))) { | |
| if (rect().x() < x) { | |
| x = qrand() % eps - ui->pushButton->width() / 4 + ui->pushButton->pos().x(); | |
| } | |
| if (rect().y() < y) { | |
| y = qrand() % eps - ui->pushButton->height() / 2 + ui->pushButton->pos().y(); | |
| } | |
| if (rect().x() >= x) { | |
| x = qrand() % eps + ui->pushButton->width() / 4 + ui->pushButton->pos().x(); | |
| } | |
| if (rect().y() >= y) { | |
| y = qrand() % eps + ui->pushButton->height() / 2 + ui->pushButton->pos().y(); | |
| } | |
| } | |
| return QPoint(x, y); | |
| } | |
| void Widget::on_pushButton_clicked() | |
| { | |
| QMessageBox::information(this, tr("Win!"), tr("Oh Yeah! You win!")); | |
| } | |
| Widget::~Widget() | |
| { | |
| delete ui; | |
| } |
| #ifndef WIDGET_H | |
| #define WIDGET_H | |
| #include <QWidget> | |
| namespace Ui { | |
| class Widget; | |
| } | |
| class Widget : public QWidget | |
| { | |
| Q_OBJECT | |
| private: | |
| QRect buttonCoords() const; | |
| void moveButton(); | |
| QPoint generateValidPoint() const; | |
| public: | |
| explicit Widget(QWidget *parent = 0); | |
| ~Widget(); | |
| protected: | |
| void timerEvent(QTimerEvent *); | |
| bool eventFilter(QObject *, QEvent *); | |
| private: | |
| Ui::Widget *ui; | |
| private slots: | |
| void on_pushButton_clicked(); | |
| }; | |
| #endif // WIDGET_H |
| <?xml version="1.0" encoding="UTF-8"?> | |
| <ui version="4.0"> | |
| <class>Widget</class> | |
| <widget class="QWidget" name="Widget"> | |
| <property name="geometry"> | |
| <rect> | |
| <x>0</x> | |
| <y>0</y> | |
| <width>400</width> | |
| <height>300</height> | |
| </rect> | |
| </property> | |
| <property name="windowTitle"> | |
| <string>Push Me!</string> | |
| </property> | |
| <widget class="QPushButton" name="pushButton"> | |
| <property name="geometry"> | |
| <rect> | |
| <x>150</x> | |
| <y>150</y> | |
| <width>80</width> | |
| <height>20</height> | |
| </rect> | |
| </property> | |
| <property name="text"> | |
| <string>Push Me!</string> | |
| </property> | |
| </widget> | |
| </widget> | |
| <layoutdefault spacing="6" margin="11"/> | |
| <resources/> | |
| <connections/> | |
| </ui> |