Можно ли иметь QWidget без дисплея? - PullRequest
1 голос
/ 18 января 2011

У меня есть консольное приложение win32 (которое может быть запущено в качестве службы Windows), где я хочу создавать объекты QWidget и взаимодействовать с ними.

Эти QWidget не будут отображаться локально (посколькунет отображения), но мне нужен доступ к операциям рисования (например, для создания их скриншота), и мне нужно перехватывать операции мыши и клавиатуры.

Цель службы - предоставить отображение виджета дляудаленное приложение.Таким образом, изображение, мышь и клавиатура предназначены для перенаправления по сети.

Возможно ли иметь объекты QWidget в консольном приложении?Каков предпочтительный метод для перехвата операций рисования, мыши и клавиатуры в этом случае?

Если это возможно, все еще возможно с объектами QAxWidget?

Ответы [ 3 ]

1 голос
/ 18 января 2011

Вы можете создать QApplication без графического интерфейса, используя один из предоставленных конструкторов :

QApplication::QApplication(int&, char**, bool GuiEnabled)

Для того, чтобы выполнять операции с графическим интерфейсом, вам все равно понадобится графический интерфейс.Например, в Linux все равно потребуется, чтобы X был запущен и доступен.Я считаю, что существуют определенные ограничения на то, что может и не может произойти, но я не могу найти сообщение в блоге на http://labs.qt.nokia.com, в котором содержатся подробности.

1 голос
/ 18 января 2011

Взгляните на Qt для встроенного Linux. . Qt спроектирован так, что вы можете сделать это, но это нетривиально.

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

0 голосов
/ 30 января 2011

В данный момент я сам пытаюсь сделать что-то подобное. Подход, который я выбрал, - это создание подкласса QGraphicsScene и переопределение события QGraphicsScene :: sceneChanged. Тогда это выглядит следующим образом (псевдокод):

QApplication app;
MyGraphicsScene* mgs = new MyGraphicsScene();
MyWidget* mw = new MyWidget();
mgs->addWidget(mw);

Теперь каждый раз, когда происходит изменение, будет вызываться ваша sceneChanged. Там вы можете получить снимок сцены в виде QImage. В моем случае я перемещаю данные пикселей в текстуру и отображаю их как наложение моей игры:

void QEOverlay::sceneChanged(QList<QRectF> list)
{
    //loop through all screen areas that changed
    foreach(QRectF rect, list)
    {
        //generate a rectangle that is a while number, and fits withing the screen
        if(rect.x() < 0) rect.setX(0);
        if(rect.y() < 0) rect.setY(0);
        if(rect.right() > _width) rect.setRight(_width);
        if(rect.bottom() > _height) rect.setRight(_height);
        rect = QRectF(Round(rect.x()),Round(rect.y()),Round(rect.width()),Round(rect.height()));

        //Create an image, create a qpainter, fill the image with transparent color, and then render a part of the scene to it
        QImage image(rect.width(),rect.height(),QImage::Format_ARGB32);
        QPainter p(&image);
        image.fill(0);
        render(&p,image.rect(),rect);

        if(tex.lock())
        {
            for (u32 y = 0; y < image.height(); y++)
            {
                for (u32 x = 0; x < image.width(); x++)
                {
                    QRgb pix = image.pixel(x, y);
                    tex.color(x + rect.left(), y + rect.top(), Color(qRed(pix), qGreen(pix), qBlue(pix), qAlpha(pix)));
                }
            }
            tex.unlock();
        }
    }
}

Существует проблема с этим подходом. Вам все еще нужно перенаправить события ввода с клавиатуры и мыши на ваш подкласс. Это не очень хорошо для меня работает, есть определенные проблемы, такие как щелчок мышью, не фокусирующий QLineEdit, или элементы в QWebView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...