You can only use QPixmap from the main (GUI) thread. Look at this for more info: http://lists.trolltech.com/qt-interest/2008-11/msg00534.html
I'm mentally parsing your code from my phone, but it looks like you should use an intermediate struct or QByteArray when you need to mess with the pixmap data. Then reload the pixmap from the main thread with loadFromData(yourbytearray). Hope that helps :) - Swyped from my droid. On Apr 28, 2012 3:53 AM, "Cyril HAENEL" <chae...@free.fr> wrote: Hello, I have a very small QT application to do for my personal use but after some days of unsuccessful I am looking for help. I am sure a QT guru can do this application in less than half an hour !! I am an electronic and C programmer enthusiast (not C++!!) . For a project which use a TFT touchscreen I want to simulate the TFT touchscreen on my computer to be able to develop and test all my embedded GUI application on my computer instead on the microcontroller target. My code is portable and can be compiled on a computer, I have a good hardware abstraction layer to hide the hardware specificity of the board/computer. The big advantage is that I don't need the board to develop my project, just need to recompile for my microcontroller and download in target when everything is OK. Thus what I need is just a QT app which simulate a TFT screen by creating an 480x272 image in which my C application (through very simple API) can change a pixel color (in RGB565 mode), get a pixel color, and get the X/Y mouse position and buttons states. Thus the QT application job is : - Create an empty 480x272 white image - Refresh the image on the window every 50ms for example (20Hz refresh rate is sufficient for me), no need to refresh the image each time a pixel is changed by my C program. - Create a thread to call a *C* function which will be the main of my C application, which never return and will use the emulated TFT screen through the API. My C program needs access to the emulated TFT screen by calling 3 functions : void setPixelColor ( unsigned short x, unsigned short y, unsigned color) unsigned short getPixelColor ( unsigned short x, unsigned short y) unsigned char getTouchScreenState ( unsigned char *x, unsigned char *y ) --> return FALSE if mouse left button is not pressed, TRUE if left button pressed with x and y for the cursor coordinates) The difficulty seems to be having a C++ QT part which periodicaly refresh a local image in the window, and a *C* thread which need to access the image pixels and mouse status. Do you think someone can help me ? I already wrote (under linux) a very horrible code, it works a little but crashes after some time with this king of error : QApplication: Invalid Display* argument QPixmap: It is not safe to use pixmaps outside the GUI thread calculateurVEframebuffer: xcb_io.c :176 : process_responses: L'assertion « !(req && current_request && !(((long) (req->sequence) - (long) (current_request)) <= 0)) » a échoué. Abandon Or sometime my 50ms periodic function is not called anymore, thus display refresh stops :( Here is my horrible code (main.cpp) : #include <qapplication.h> #include <qpainter.h> #include <qlabel.h> #include <qpixmap.h> #include <qpaintdevice.h> #include <qtimer.h> #include <stdio.h> #include <signal.h> #include <sys/time.h> #include <pthread.h> QApplication* app = new QApplication( 0, 0 ); QImage* image = new QImage(480,272, QImage::Format_ARGB32); QLabel myLabel; // Bridge with the C program part extern "C" { int mainDemo (void); // Change pixel color on the emulated TFT screen void _PutPixel(short x, short y, short color ); // Get pixel color on the emulated TFT screen unsigned short _GetPixel(short x, short y ); // Indicate mouse position on the emulated TFT screen and mouse buttons statePermet de connaitre la position X/Y de la souris sur l'ecran TFT virtuel et l'état des boutons extern short mouseX, mouseY, mouseState; } // API used by the C program part #define GFX_COLOR unsigned short #define RGBConvert(red, green, blue) (GFX_COLOR) (((((GFX_COLOR)(red) & 0xF8) >> 3) << 11) | ((((GFX_COLOR)(green) & 0xFC) >> 2) << 5) | (((GFX_COLOR)(blue) & 0xF8) >> 3)) void _PutPixel(short x, short y, short color ) { QRgb pixel; pixel = qRgb( ((color>>11)&0b11111)<<3, ((color>>5)&0b111111)<<2, (color&0b11111)<<3 ); image->setPixel( x, y, pixel ); } unsigned short _GetPixel(short x, short y ) { QRgb color; color = image->pixel(x, y); return( RGBConvert( (color>>16)&0xFF,(color>>8)&0xFF,color&0xFF ) ); } // Periodic function called every 50ms the simulate the TFT screen refresh by reloading the // image in the window static void timer50msInt ( int sig ) { QPoint mousePos; QRect geom; int mouseButton, x, y; signal( SIGALRM, timer50msInt ); // Image reload myLabel.setPixmap(QPixmap::fromImage(*image)); // Get mouse coordinate and convert in window mouse coordinate with the window position mousePos = QCursor::pos(); x = mousePos.x(); y = mousePos.y(); geom = myLabel.geometry(); x = x - geom.x(); y = y - geom.y(); // Get mouse buttons state mouseButton = app->mouseButtons(); // Pass mouse coordinate and mouse button states to the C program part mouseX = x; mouseY = y; mouseState = mouseButton; // printf( "%d %d %d\n", x, y, mouseButton ); } // Launch 50ms periodic function void _timerInit ( void ) { struct itimerval timer; timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = 50000; timer.it_value.tv_sec = timer.it_interval.tv_sec; timer.it_value.tv_usec = timer.it_interval.tv_usec; signal( SIGALRM, timer50msInt ); setitimer( ITIMER_REAL, &timer, NULL ); } // Thread used to call my C program part which will use the virtual TFT touchscreen void* monAppli ( void *ptr ) { usleep( 500000 ); // Launch the 50ms periodic function _timerInit(); // My C program part which use the virtual TFT touchscreen mainDemo(); return 0; } int main (int argc, char* argv[]) { pthread_t thread; // Thread creation for my C program part pthread_create( &thread, NULL, monAppli, (void*) NULL); // Loading of the image whish simulate the TFT screen content myLabel.setPixmap(QPixmap::fromImage(*image)); myLabel.show(); return app->exec() ; } Regards Cyril HAENEL -- Cyril Haenel Registered Linux User #332632 _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest