【问题标题】:Keep a stream from fstream open through member functions通过成员函数保持来自 fstream 的流打开
【发布时间】:2009-07-10 19:22:06
【问题描述】:

我试图保持一个流到文件 /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);

布莱斯

【问题讨论】:

    标签: c++ linux user-interface qt fstream


    【解决方案1】:

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

    【讨论】:

    • 我最终确实注意到了这一点。我正在尝试打开文件并将指针设置为指向类中的第一个帧缓冲区地址,但不在我认为有效但不完全确定的任何成员函数中,我似乎遇到了很多错误,但正在解决它们。
    【解决方案2】:

    那是因为 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 指向第一个像素。我在这里做了很多假设,因为这个问题有点不清楚。

    【讨论】:

    • 谢谢!我会看看它,看看能做些什么。至于 blit 操作,只要屏幕上发生变化,就需要执行此操作,因此它并不真正适合连接功能,因为连接并不意味着每秒运行几次!希望对您有所帮助,我会相应更新。
    猜你喜欢
    • 2011-09-25
    • 2012-07-25
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多