C++ (Qt)/// Класс для переопределения виджета каждого визираclass VFFrame: public QFrame{ Q_OBJECT private: QPoint _move_point; ///< точка целеуказания, куда необходимо двигать signals: void moveVF(); public: void setMovePoint(const QPoint& pnt) { _move_point = pnt; }}; /// Передвижение визира вслед за мышьюvoid VFFrame::mouseMoveEvent(QMouseEvent* events){ QFrame::mouseMoveEvent(events); emit moveVF(); if(!_is_left_pressed) return; if(_vf_shape == QFrame::VLine) setGeometry(_move_point.x(), y(), width(), height()); else if(_vf_shape == QFrame::HLine) setGeometry(x(), _move_point.y(), width(), height());} /// Отпускание кнопки мышиvoid VFFrame::mouseReleaseEvent(QMouseEvent* events){ QFrame::mouseReleaseEvent(events); emit moveVF(); if(!_is_left_pressed) return; _is_left_pressed = false; if(_vf_shape == QFrame::VLine) setGeometry(_move_point.x(), y(), width(), height()); else if(_vf_shape == QFrame::HLine) setGeometry(x(), _move_point.y(), width(), height()); _is_viewfinder = false;} /// Изменение размеров окнаvoid VFFrame::resizeEvent(QResizeEvent* events){ if(_vf_shape == QFrame::VLine) setGeometry(x(), 0, 16, parentWidget() -> height()); else if(_vf_shape == QFrame::HLine) setGeometry(0, y(), parentWidget() -> width(), 16);} /// Класс для отображения параметров по времени или по расстояниюclass GraphicDisplay : public QDialog, public Ui::GraphicDisplayClass{ Q_OBJECT private: QList<VFFrame*> viewfinderList; ///< список всех визиров QPoint _move_pointVF; ///< точка, куда следует перемещаться визир void connectViewfinder(); void disconnectViewfinder(); private slots: void setMovePoint();}; /// Проверка на попадание фокуса на визирbool GraphicDisplay::isViewfinder(const QPoint& pos){ foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { _move_pointVF = pos; return true; } return false;} /// Подсоединение сигналаvoid GraphicDisplay::connectViewfinder(){ foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { connect(pf, SIGNAL(moveVF()), this, SLOT(setMovePoint())); break; }} /// Разъединение сигналаvoid GraphicDisplay::disconnectViewfinder(){ foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { disconnect(pf, SIGNAL(moveVF()), this, SLOT(setMovePoint())); break; }} /// Нажатие на кнопку - рисование "резиновой ленты"void GraphicDisplay::mousePressEvent(QMouseEvent* events){ QWidget::mousePressEvent(events); if(isViewfinder(events -> pos())) { connectViewfinder(); return; }// ....................................} /// Переопределение функции передвижения мышиvoid GraphicDisplay::mouseMoveEvent(QMouseEvent* events){ if(isViewfinder(events -> pos())) return; // .............................................} /// Возвращение прежнего вида курсору и изменение масштабаvoid GraphicDisplay::mouseReleaseEvent(QMouseEvent* events){ if(isViewfinder(events -> pos())) { disconnectViewfinder(); return; } // ....................................................................}
C++ (Qt)// in headerprivate slots: void setMovePoint(); /// Слот установки экранных координат во фрейм визираvoid GraphicDisplay::setMovePoint(){ foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { pf -> setMovePoint(_move_pointVF); break; }}
C++ (Qt)/// Класс для переопределения виджета каждого визираclass VFFrame: public QFrame{ Q_OBJECT private: Shape _vf_shape; ///< форма визира (вертикальный или горизонтальный) bool _is_left_pressed; ///< флаг указания нажатия на левую кнопку мыши bool _is_viewfinder; ///< флаг сигнализации о наведении курсора мыши на визир QPoint _move_point; ///< точка целеуказания, куда необходимо двигать signals: void moveVF(); protected: virtual void mousePressEvent(QMouseEvent* events); virtual void mouseMoveEvent(QMouseEvent* events); virtual void mouseReleaseEvent(QMouseEvent* events); virtual void resizeEvent(QResizeEvent* events); virtual void enterEvent(QEvent* events) { _is_viewfinder = true; } virtual void leaveEvent(QEvent* events) { _is_viewfinder = false; } public: VFFrame(QWidget *parent, const Shape shape = QFrame::VLine); virtual ~VFFrame() {} void setShape(const Shape shape) { setFrameShape(shape); _vf_shape = shape; } bool isViewfinder() const { return _is_viewfinder; } void setMovePoint(const QPoint& pnt) { _move_point = pnt; }}; /// Переопределение нажатия на лекую кнопку мышиvoid VFFrame::mousePressEvent(QMouseEvent* events){ QFrame::mousePressEvent(events); emit moveVF(); switch(events -> button()) { case Qt::LeftButton: ///< если нажата левая кнопка мыши _is_left_pressed = true; break; }} /// Передвижение визира вслед за мышьюvoid VFFrame::mouseMoveEvent(QMouseEvent* events){ QFrame::mouseMoveEvent(events); emit moveVF(); if(!_is_left_pressed) return; if(_vf_shape == QFrame::VLine) setGeometry(_move_point.x(), y(), width(), height()); else if(_vf_shape == QFrame::HLine) setGeometry(x(), _move_point.y(), width(), height());} /// Отпускание кнопки мышиvoid VFFrame::mouseReleaseEvent(QMouseEvent* events){ QFrame::mouseReleaseEvent(events); emit moveVF(); if(!_is_left_pressed) return; _is_left_pressed = false; if(_vf_shape == QFrame::VLine) setGeometry(_move_point.x(), y(), width(), height()); else if(_vf_shape == QFrame::HLine) setGeometry(x(), _move_point.y(), width(), height()); _is_viewfinder = false;} /// Слот установки экранных координат во фрейм визираvoid GraphicDisplay::setMovePoint(){ foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { pf -> setMovePoint(_move_pointVF); break; }} /// Проверка на попадание фокуса на визирbool GraphicDisplay::isViewfinder(const QPoint& pos){ foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { _move_pointVF = pos; return true; } return false;} /// Подсоединение сигналаvoid GraphicDisplay::connectViewfinder(){ foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { connect(pf, SIGNAL(moveVF()), this, SLOT(setMovePoint())); break; }} /// Разъединение сигналаvoid GraphicDisplay::disconnectViewfinder(){ foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { disconnect(pf, SIGNAL(moveVF()), this, SLOT(setMovePoint())); break; }} /// Копирование визировvoid GraphicDisplay::copyingViewfinder(QMouseEvent* events){ if(events -> button() != Qt::LeftButton || events -> modifiers() != Qt::ControlModifier) return; foreach(VFFrame* pf, viewfinderList) if(pf -> isViewfinder()) { appendViewfinder(pf -> frameShape()); break; }} /// Нажатие на кнопку - рисование "резиновой ленты"void GraphicDisplay::mousePressEvent(QMouseEvent* events){ QWidget::mousePressEvent(events); if(isViewfinder(events -> pos())) { copyingViewfinder(events); connectViewfinder(); return; }// ...................} /// Переопределение функции передвижения мышиvoid GraphicDisplay::mouseMoveEvent(QMouseEvent* events){ if(isViewfinder(events -> pos())) return;// ......................} /// Возвращение прежнего вида курсору и изменение масштабаvoid GraphicDisplay::mouseReleaseEvent(QMouseEvent* events){ if(isViewfinder(events -> pos())) { disconnectViewfinder(); return; }}