Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: gleam от Февраль 03, 2013, 21:11



Название: Создание области выделения
Отправлено: 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
да не за что :)