关闭QT5应用程序窗口后,不会清除显示

时间:2016-05-19 11:34:30

标签: linux embedded-linux qt5.4

我使用yocto为TexasInstruments DRA7XX-EVM板交叉编译了Qt5.4.8。以下是我的配置选项。

QT_CONFIG_FLAGS = \
-rpath \
-pkg-config \
-opengl es2 \
-no-accessibility \
-dbus \
-no-directfb \
-evdev \
-make examples \
-compile-examples \
-no-fontconfig \
-freetype \
-no-iconv \
-icu \
-system-libjpeg \
-system-libpng \
-make libs \
-eglfs \    
-kms \    
-linuxfb \
-no-mitshm \
-no-mtdev -no-nis -openssl-linked -no-openvg -qt-pcre -pulseaudio -release -no-sm -no-sql-db2 -no-sql-ibase -no-sql-mysql -no-sql-oci -no-sql-odbc -no-sql-psql -no-sql-sqlite -no-sql-sqlite2 -no-sql-tds -nomake tests -make tools -no-tslib -libudev -widgets -no-xcb -no-xcursor -no-xfixes -no-xinerama -no-xinput -no-xinput2 -no-xkb -no-xkbcommon -no-xrandr -no-xrender -no-xshape -no-xsync -no-xvideo -system-zlib \
-no-wayland \
-force-pkg-config \

我已在目标shell上导出以下变量:

  

export QT_QPA_PLATFORM=linuxfb

     

export QT_QPA_GENERIC_PLUGINS=evdevtouch,evdevmouse,evdevkeyboard

     

export QT_QPA_EVDEV_KEYBOARD_PARAMETERS=grab=1

我运行我的应用程序: $。/ MyApplication的

窗口在屏幕上正确显示。但是当我退出应用程序时,屏幕不会被清除。 请检查我的配置选项,并告诉我是否需要进行任何更改。还有一些关于在窗口关闭后清除帧缓冲的解决方案。

3 个答案:

答案 0 :(得分:1)

我通过使用qAddPostRoutine()添加一个在退出时清除帧缓冲区的例程来解决这个问题。

以下是明确的功能:

//Used on exit to clear the fb
static void fbclear()
{
   char dev[256] = "/dev/fb";
   struct fb_var_screeninfo var_info;
   int fd = open(dev, O_RDWR);
   int line_size;
   int buffer_size;
   void *buffer = NULL;
   if (fd < 0) {
       printf("failed to open %s display device\n", dev);
       return;
   }
   //get display size
   ioctl (fd, FBIOGET_VSCREENINFO, &var_info);
   line_size = var_info.xres * var_info.bits_per_pixel / 8;
   buffer_size = line_size * var_info.yres;
   //malloc buffer and set to 0
   buffer = malloc(buffer_size);
   memset(buffer, 0, buffer_size);
   //write zeros to display
   write(fd, buffer, buffer_size);
   free(buffer);
   close(fd);
   return;
}

然后我将以下内容添加到我的main():

qAddPostRoutine(fbclear);

答案 1 :(得分:0)

我遇到了同样的问题,并在main()中定义了以下信号处理程序,例如:CleanExit cleanExit;,以解决此问题:

#include <csignal>

struct CleanExit{
        CleanExit() {
                signal(SIGINT, &CleanExit::exitQt);
                signal(SIGTERM, &CleanExit::exitQt);
        }

        static void exitQt(int sig) {
                QCoreApplication::exit(0);
        }
};

答案 2 :(得分:0)

好吧,我知道这是一个老问题,但对于任何为此苦苦挣扎的人,我可能已经找到了解决方案。

如果退出 linuxfb Qt 应用程序后您的屏幕没有重置并且没有接收到输入,这意味着 Qt 由于某种原因未能自行重置,您必须手动执行相同的操作。为此,查看 qfbvthandler.cpp 很有用,但这是我所做的:

  1. 在初始化任何 Qt 对象之前备份当前 tty 的模式:
int k_mode = -1; // back up variable
...
int tfd = open("/dev/tty", O_RDWR);
if (tfd == -1) throw runtime_error("Cannot open TTY");
ioctl(tfd, KDGKBMODE, &k_mode);
if (k_mode == -1) throw runtime_error("Cannot recieve KDBMODE");
close(tfd);

  1. QApplication::quit() 完成 Qt 未能完成的工作后:
int tfd = open("/dev/tty", O_RDWR);
if (tfd == -1) throw runtime_error("Cannot open TTY");
ioctl(tfd, KDSETMODE, KD_TEXT); // return to text mode from graphics mode
ioctl(tfd, 0x4b51, 0); // 0x4b51=KDKBMUTE, from qfbvthandler.cpp
ioctl(tfd, KDSKBMODE, k_mode); // set keyboard mode back
k_mode = -1;
const auto blink_on = "\033[9;15]\033[?33h\033[?25h\033[?0c"; // from qfbvthandler.cpp
write(tfd, blink_on, strlen(blink_on) + 1); // enable blanking and cursor
close(tfd);