我使用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的
窗口在屏幕上正确显示。但是当我退出应用程序时,屏幕不会被清除。 请检查我的配置选项,并告诉我是否需要进行任何更改。还有一些关于在窗口关闭后清除帧缓冲的解决方案。
答案 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 很有用,但这是我所做的:
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);
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);