是否有可能没有显示器的QWidget?

时间:2011-01-18 15:08:39

标签: windows qt

我有一个仅限控制台的win32应用程序(可以作为Windows服务启动),我想创建QWidget对象并与之交互。

这些QWidget不会在本地呈现(因为没有显示)但我需要访问绘画操作(例如创建它们的截图),我需要拦截鼠标和键盘操作。

该服务的目的是向远程应用程序提供窗口小部件的显示。因此,图像,鼠标和键盘应通过网络重定向。

是否可以在控制台应用程序中使用QWidget对象?在这种情况下拦截绘画,鼠标和键盘操作的首选方法是什么?

如果可以,QAxWidget对象是否还可以使用?

3 个答案:

答案 0 :(得分:1)

查看Qt for embedded Linux.。 Qt的设计使你可以做到这一点,但这并非易事。

但是,如果您的控制台模式服务需要键盘,鼠标和图形用户界面,我确实怀疑您没有走上正轨。与用户交互的需要告诉我它不应该是服务,并且需要鼠标表明它不应该是控制台应用程序。

答案 1 :(得分:1)

您可以使用其中一个provided constructors创建一个没有Gui的QApplication

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

为了进行GUI操作,您仍然需要一个可用的GUI。例如,在Linux上,它仍然需要X运行并且可用。我相信对可以发生和不可发生的内容存在某些限制,但无法在http://labs.qt.nokia.com上找到提供详细信息的博客文章。

答案 2 :(得分:0)

此刻我自己正在尝试做类似的事情。我采取的方法是创建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中的元素。