Russian Qt Forum
Ноябрь 23, 2024, 17:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание области выделения  (Прочитано 5468 раз)
gleam
Гость
« : Февраль 03, 2013, 21:11 »

Здравствуйте.
Есть задача - пользователь должен указать интересующую область окна.
То есть, должна быть некая область (виджет?) с возможностью изменения размера, перемещения и поворота:


Теперь вопрос - имеются ли для этого какие-нибудь стандартные средства, и если нет, то как бы Вы посоветовали это реализовать?
Записан
Bepec
Гость
« Ответ #1 : Февраль 03, 2013, 21:46 »

Это называется .... ммм... как же... наверное это .... Виджет? Улыбающийся Или мб фрейм?

Мало данных. Чьё окно в каком контексте и прочее )
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Февраль 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();
}
Записан

gleam
Гость
« Ответ #3 : Февраль 03, 2013, 22:23 »

Это называется .... ммм... как же... наверное это .... Виджет? Улыбающийся Или мб фрейм?

Мало данных. Чьё окно в каком контексте и прочее )

захват изображения с вебкамеры (OpenCV, виджет VideoWidget (унаследованный от QWidget)),
далее - распознавание прямоугольников (OpenCV, виджет VisionWidget, унаследованный от VideoWidget),
если на кадре не обнаружены прямоугольники - появляется рамка, которой надо этот прямоугольник выделить.
Это немного более подробно, если будут еще вопросы - отвечу Улыбающийся

Я планировал поверх VisionWidget`а положить виджет, который описал первым сообщением (рамка, умеющая перемещаться и трансформироваться), но если сможете предложить более хороший вариант - буду благодарен.


gil9red,
спасибо, посмотрю код утром - сейчас уже голова не очень соображает Улыбающийся
added: не нашел поворота, а именно с ним у меня и проблемы - перемещение и ресайз более-менее представляю как сделать, но вот поворот...
« Последнее редактирование: Февраль 03, 2013, 22:25 от gleam » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Февраль 03, 2013, 23:28 »

да не за что Улыбающийся
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 22.