Название: Создание области выделения
Отправлено: gleam от Февраль 03, 2013, 21:11
Здравствуйте. Есть задача - пользователь должен указать интересующую область окна. То есть, должна быть некая область (виджет?) с возможностью изменения размера, перемещения и поворота: (https://dl.dropbox.com/u/16938189/work/aim/pcv/2013-02-03_220224.png)
Теперь вопрос - имеются ли для этого какие-нибудь стандартные средства, и если нет, то как бы Вы посоветовали это реализовать?
Название: Re: Создание области выделения
Отправлено: Bepec от Февраль 03, 2013, 21:46
Это называется .... ммм... как же... наверное это .... Виджет? :) Или мб фрейм?
Мало данных. Чьё окно в каком контексте и прочее )
Название: Re: Создание области выделения
Отправлено: gil9red от Февраль 03, 2013, 21:48
насчет стандартных сомневаюсь) делал похожее, еще когда только-только изучал Qt и дорабатывал скриншотер из примеров) h: /* Этот класс наследуется от QWidget создает окно без рамки окно на весь экран и прозрачно на половину на этом окне можно выделять область при нажатии пробела, виджет подает сигнал и закрывается
связываю этот класс с классом ScreenShot когда поступает сигнал, класс ScreenShot его отлавливает и получает координаты выделенной области, после чего делает по ним скриншот области экрана */ class SelectedArea: public QWidget { Q_OBJECT
public: int x0, y0, x1, y1; QRect rectSelectedArea; bool mousePress;
public: SelectedArea(QWidget * parent = 0);
signals: void areaIsSelected(void); void windowClose(void);
protected: void paintEvent(QPaintEvent *); void keyReleaseEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void closeEvent(QCloseEvent *); };
cpp: SelectedArea::SelectedArea(QWidget * parent) { setWindowFlags(Qt::FramelessWindowHint); setWindowOpacity(0.5);
setGeometry(QApplication::desktop()->geometry()); mousePress = false; x0 = 0; y0 = 0; x1 = 0; y1 = 0; }
void SelectedArea::paintEvent(QPaintEvent *) { QPainter painter(this);
painter.setBrush(Qt::black); painter.setPen(Qt::black); painter.drawRect(rect());
QPen pen; pen.setColor(Qt::white); pen.setStyle(Qt::DashLine); painter.setPen(pen); painter.setBrush(QColor(100, 100, 100)); painter.drawRect(x0, y0, x1-x0, y1-y0);
QString textHint; textHint = tr("Для снимка нажмите SPACE, ENTER или среднюю кнопку мыши"); textHint+= tr("\n"); textHint+= tr("Для закрытия нажмите ESCAPE, Alt+F4, или правую кнопку мыши");
QFont font; font.setPixelSize(30);
painter.setFont(font); painter.setPen(Qt::white);
painter.drawText(rect(), Qt::AlignCenter, textHint); } void SelectedArea:: keyReleaseEvent(QKeyEvent *event) { if(event->key() == Qt::Key_Escape) { close(); } if(event->key() == Qt::Key_Space || event->key() == Qt::Key_Return) { if(x0 > x1) { int temp = x0; x0 = x1; x1 = temp; }
if(y0 > y1) { int temp = y0; y0 = y1; y1 = temp; }
close(); emit areaIsSelected(); } } void SelectedArea:: mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { mousePress = true; x0 = event->x(); y0 = event->y();
setCursor(QCursor(Qt::CrossCursor)); } if(event->button() == Qt::RightButton) { close(); } } void SelectedArea:: mouseReleaseEvent(QMouseEvent *event) { mousePress = false; setCursor(QCursor(Qt::ArrowCursor));
if(event->button() == Qt::MiddleButton) { close(); emit areaIsSelected(); } } void SelectedArea:: mouseMoveEvent(QMouseEvent *event) { if(mousePress) { x1 = event->x(); y1 = event->y(); update(); } }
void SelectedArea:: closeEvent(QCloseEvent *) { emit windowClose(); }
Название: Re: Создание области выделения
Отправлено: gleam от Февраль 03, 2013, 22:23
Это называется .... ммм... как же... наверное это .... Виджет? :) Или мб фрейм?
Мало данных. Чьё окно в каком контексте и прочее )
захват изображения с вебкамеры (OpenCV, виджет VideoWidget (унаследованный от QWidget)), далее - распознавание прямоугольников (OpenCV, виджет VisionWidget, унаследованный от VideoWidget), если на кадре не обнаружены прямоугольники - появляется рамка, которой надо этот прямоугольник выделить. Это немного более подробно, если будут еще вопросы - отвечу :) Я планировал поверх VisionWidget`а положить виджет, который описал первым сообщением (рамка, умеющая перемещаться и трансформироваться), но если сможете предложить более хороший вариант - буду благодарен. gil9red,спасибо, посмотрю код утром - сейчас уже голова не очень соображает :) added: не нашел поворота, а именно с ним у меня и проблемы - перемещение и ресайз более-менее представляю как сделать, но вот поворот...
Название: Re: Создание области выделения
Отправлено: gil9red от Февраль 03, 2013, 23:28
да не за что :)
|