Держите поток из fstream открытым через функции-члены - PullRequest
0 голосов
/ 10 июля 2009

Я пытаюсь сохранить поток в файле / 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);

Bryce

Ответы [ 2 ]

5 голосов
/ 10 июля 2009

Вы объявили myscreen_Fb только в функции "connect". Либо сделайте его членом класса myscreen, либо, что еще лучше, просто передайте его в качестве аргумента функции "blit".

1 голос
/ 11 июля 2009

Это потому, что 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;
};

В связи с этим вопросом: «Я не могу получить указатель на первый видимый пиксель, открытый для использования», что именно вы здесь имеете в виду? Все, что я могу предположить, это то, что вы хотите использовать blit, используя изображение ptr, созданное вами в 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();   //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 получает ptr для первого пикселя. Я делаю много предположений здесь, потому что вопрос немного неясен.

...