Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Снимок выделенной области экрана 
:(
    Опции темы
TIT
  Дата 16.10.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 4.4.2010

Репутация: нет
Всего: 3



Необходимо реализовать возможность сделать снимок не всего экрана, а только выделенной мышкой области.
Для создания снимка экрана использую QPixmap.
Код

QPixmap::grabWindow(QApplication::desktop()->winId());

Данный код снимает весь экран, а именно десктоп (id == 0).
У grabWindow можно в аргументах добавить x, y начала области и w, h ширину и высоту области, которую надо снять.
Вопрос, как мне выделить мышкой (поверх всех окон) необходимую мне область и по onMouseUp (отжатие кнопки мышки) получить x, y, h, w выделенного мной региона?

Вот как-то так.
user posted image

Это сообщение отредактировал(а) TIT - 16.10.2010, 20:36
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
ufna
Дата 16.10.2010, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 4.4.2005
Где: Курган/СПб

Репутация: нет
Всего: 0



Элементарно, Ватсон smile Посмотри как "Ножницы" в висте/семерке реализованы. Самое простое - создается полупрозрачный виджет на весь экран, на нем отрабатываешь выделение, и далее уже - на основе этих данных грабишь рабочий стол, предварительно скрыв этот виджет. Он может быть к примеру (255,255,255,1) - считай прозрачный. 
PM MAIL WWW Skype   Вверх
TIT
Дата 16.10.2010, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 4.4.2010

Репутация: нет
Всего: 3



Большое спасибо за идею.
Осталось теперь (мне) понять, как "собрать" нужные данные с виджета.
Создать виджет размером с рабочий стол я могу, а вот дальше, как отследить на нём выделение мышкой...
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
borisbn
Дата 16.10.2010, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



как-то так

widget.h:
Код

class Widget : public QWidget {
...

    virtual void mouseMoveEvent( QMouseEvent * event );
    virtual void mousePressEvent( QMouseEvent * event );
    virtual void mouseReleaseEvent( QMouseEvent * event );
    
    QPoint m_first;
    QRect m_selected;
};


widget.cpp:
Код

...
Widget::Widget(QWidget *parent) : QWidget( parent, Qt::FramelessWindowHint ) {
      setWindowOpacity( 0.6 );
      setGeometry( QApplication::desktop()->geometry() );
...
}

void Widget::mousePressEvent( QMouseEvent * event )
{
    if ( hasLeftButton( event ) == false )
    {
        return;
    }
    m_first = event->pos();
}

void Widget::mouseMoveEvent( QMouseEvent * event )
{
    if ( hasLeftButton( event ) == false || m_first.isNull() )
    {
        return;
    }
    QPoint second = event->pos();
    int x0 = std::min( m_first.x(), second.x() );
    int y0 = std::min( m_first.y(), second.y() );
    int x1 = std::max( m_first.x(), second.x() );
    int y1 = std::max( m_first.y(), second.y() );
    m_selected = QRect( QPoint( x0, y0 ), QPoint( x1, y1 ) );
    QRegion region( rect() );
    region = region.subtracted( m_selected );
    setMask( region );
}

void Widget::mouseReleaseEvent( QMouseEvent * event )
{
    if ( hasLeftButton( event ) )
    {
        return;
    }
    // m_selected - нужный участок
    qApp->quit();
}


...
bool hasLeftButton( QMouseEvent * event )
{
    if ( event->buttons() & Qt::LeftButton )
    {
        return true;
    }
    return false;
}



Это сообщение отредактировал(а) borisbn - 16.10.2010, 23:51


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SABROG
Дата 17.10.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Решил тоже написать свой вариант.

Код

#include <QtGui/QDesktopWidget>
#include <QtGui/QMouseEvent>
#include <QtGui/QPaintEvent>
#include <QtGui/QPainter>
#include <QtGui/QFileDialog>
#include <QtGui/QPixmap>

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint)
{
    setAttribute(Qt::WA_TranslucentBackground);
    setGeometry(QApplication::desktop()->screenGeometry(this));
}

Widget::~Widget()
{
}

void Widget::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton) {
        origin = event->pos();
        rubberBandRect = QRect(origin, QSize());
    }
    else if (event->button() == Qt::RightButton) {
        if (!rubberBandRect.size().isNull()) {
            QString fileName = QFileDialog::getSaveFileName(this
                                         , tr("Save As...")
                                         , "untitled.png"
                                         , tr("Images (*.png)"));
            if (!fileName.isEmpty()) {
                hide();
                QPixmap screenShot =
                        QPixmap::grabWindow(QApplication::desktop()->winId()
                                    , rubberBandRect.x()
                                    , rubberBandRect.y()
                                    , rubberBandRect.width()
                                    , rubberBandRect.height());
                QApplication::beep();
                show();
                screenShot.save(fileName);
            }
        }
            QCoreApplication::exit();
    }
}

void Widget::mouseMoveEvent(QMouseEvent* event)
{
    if (event->buttons() & Qt::LeftButton) {
        rubberBandRect = QRect(origin, event->pos()).normalized();

        QPoint direction = origin - event->pos();
        bool isForwardX = direction.x() >= 0;
        bool isForwardY = direction.y() >= 0;

        if ((isForwardX && isForwardY) || (!isForwardX && !isForwardY))
            setCursor(Qt::SizeFDiagCursor);
        else
            setCursor(Qt::SizeBDiagCursor);
        update();
    }
}

void Widget::mouseReleaseEvent(QMouseEvent* event)
{
    setCursor(Qt::ArrowCursor);
}

void Widget::paintEvent(QPaintEvent* event)
{
    QPainter painter(this);
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.fillRect(event->rect(), QColor(0, 0, 0, 127));
    if (!rubberBandRect.size().isNull()) {
        QPen pen(Qt::green, 2, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin);
        painter.setPen(pen);
        painter.drawRect(rubberBandRect);
        painter.fillRect(rubberBandRect, QColor(0, 0, 0, 1));
    }
}



user posted image



Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  rubberBandGrabWindow.tar.gz 1,37 Kb


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
TIT
Дата 25.10.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 4.4.2010

Репутация: нет
Всего: 3



borisbn и SABROG, большое спасибо за помощь.
Реализовал класс (см. вложение) следующим образом (на основе ваших подсказок).



Это сообщение отредактировал(а) TIT - 25.10.2010, 10:06

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  tScreenShot.tar.gz 0,91 Kb
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.