0

我试图保持一个流到文件 /dev/fb0 (linux framebuffer) 在几个 Qt 成员函数中打开。目标是使用 myscreen::connect 函数打开帧缓冲区

bool myscreen::connect()
{
std::fstream myscreen_Fb;
myscreen_Fb.open("/dev/fb0")
QImage* image;
image = new QImage(w, h, QImage::Format_RGB888);
QScreen::data = image->bits();
}

理想情况下,这将打开帧缓冲区并创建一个新的 QImage 来充当正在写入屏幕的数据的内存缓冲区。然后我的“图像”将通过 bits() 函数指向屏幕上的第一个可见像素(内存)。我必须实现这一点,因为我的硬件不支持默认内存映射。

然后我想将它粘贴到屏幕上:

void myscreen::blit(const QImage &img, const QPoint &topLeft, const QRegion &region)
{

QScreen::blit(img, topLeft, region);
write(myscreen_Fb, image.bits(), image.size());
}

我似乎无法获得指向第一个可用像素的指针,也无法从 GCC 那里得到关于 myscreen_Fb 未在范围内声明的投诉。有任何想法吗?

更新

我进行了建议的更改并在类中声明了该函数,但得到了这个让我发疯的错误。

error: expected constructor, destructor, or type conversion before '.' token

它指的是包含以下内容的行:

vopuscreenFd.open("/dev/fb0", fstream::out);

布莱斯

4

2 回答 2

5

您仅在“连接”函数的范围内声明了 myscreen_Fb。要么让它成为 myscreen 类的成员,要么更好地将它作为参数传递给“blit”函数。

于 2009-07-10T19:24:16.547 回答
1

那是因为 myscreen_Fb 实际上并没有在 blit 函数的范围内声明。在这里,您在 connect() 函数中声明了它。

将 myscreen_Fb 声明为 myscreen 类的成员变量。该类实例中的所有函数都可以访问它。

class myscreen
{
  public:
     myscreen( void );
    ~myscreen( void );

    bool
    connect  ( void );

    void 
    blit     ( const QImage &img, 
               const QPoint &topLeft, 
               const QRegion &region)

  private: 
    std::fstream myscreen_Fb;
};

关于这个问题:“我似乎无法获得指向第一个开放使用的可见像素的指针”,你在这里到底是什么意思?我只能假设你的意思是使用你在 connect 中创建的图像 ptr 来使用 blit,它还不是一个成员变量,所以也许你想这样做:

bool myscreen::connect()
{
    std::fstream myscreen_Fb;
    myscreen_Fb.open("/dev/fb0")
    QImage* image;
    image = new QImage(w, h, QImage::Format_RGB888);
    //QScreen::data = image->bits();   //don't need this?
    blit( image, "topleft ref", "region ref");     //add this, replacing 
                                                   // "topleft ref" and
                                                   // "region ref" with correct 
                                                   // values you've pulled
}

myscreen::blit 中的 write 函数将 ptr 指向第一个像素。我在这里做了很多假设,因为这个问题有点不清楚。

于 2009-07-10T21:03:48.673 回答