好记性不如烂笔头,记录一些Qt学习过程中的笔记。
1 遍历所有session dbus的服务名和接口名的参考方法123456789101112131415161718192021222324void testDbusInterface(){if (!QDBusConnection::sessionBus().isConnected()) {fprintf(stderr, "Cannot connect to the D-Bus session bus.\n""To start it, run:\n""\teval `dbus-launch --auto-syntax`\n");return 1;}QDBusReply reply = QDBusConnection::sessionBus().interface()->registeredServiceNames();if (!reply.isValid()) {qDebug() setMargin(0);mainLayout->addWidget(m_xcbWidget);this->setLayout(mainLayout);}int Widget::initXcbDri3(){xcb_window_t win;xcb_connection_t *c;int ret;int drm_fd;c = QX11Info::connection();win = (uintptr_t)m_xcbWidget->winId();printf("win Id:%d\n", win);//init and get drm fd from xcb-dri3drm_fd = xcb_dri3_helper_open(c, win);if (drm_fd < 0) {fprintf(stderr, "ERROR: DRI3 failed to initialize");goto fail;}ret = xcb_dri3_helper_drawable_init(c, win, &draw, drm_fd);if (ret) {returun 1;}return 0;}XcbWidget::XcbWidget(QWidget *parent): QWidget(parent){setFixedSize(480, 800);setAttribute(Qt::WA_PaintOnScreen, true);//重写要被第三方库渲染的控件,在其构造函数中添加setAttribute(Qt::WA_PaintOnScreen, true)}重新实现父类虚函数 QPaintEngine *paintEngine() const,这里需要配合setAttribute(Qt::WA_PaintOnScreen, true)进行使用,避免Qt的渲染引擎和dri3的渲染引擎冲突而导致无视频刷新时拖动界面时出现的白板或黑板现象
1234QPaintEngine *XcbWidget::paintEngine() const{return 0;}3 解决Qt中signals和gio/gst中signals冲突的问题在Qt工程中,一个类中用到gio或gst的函数,且在引入gio或gst的头文件后,编译时会遇到类似如下的报错:error: expected unqualified-id before ‘public’ GDBusSignalInfo **signals;。遇到这种情况,有几种办法可以解决。
所有glib的头文件引入放在Qt的头文件引入之前pro文件中加入:CONFIG += no_keywords, 并在代码中使用Q_SIGNALS替换signals#undef signals …… #define signals public原因分析:结构体_GDBusInterfaceInfo中的signals与Qt中的信号signals关键词冲突了。 12345678910struct _GDBusInterfaceInfo{ /*< public >*/ volatile gint ref_count; gchar*name; GDBusMethodInfo **methods; GDBusSignalInfo **signals; GDBusPropertyInfo**properties; GDBusAnnotationInfo **annotations;};
下面代码段演示了第三种的使用方法 123456789101112131415161718192021222324252627282930313233343536utils.h#include class Utils : public QObject{Q_OBJECTpublic:explicit Utils(QObject *parent = 0);~Utils();};utils.cpp#include "utils.h"#undef signalsextern "C" {#include #include #include #include }#define signals publicUtils::Utils(QObject *parent) :QObject(parent){}Utils::~Utils(){}
4 Qt qDebug打印信息处理在调试Qt程序时,经常需要qDebug打印信息,尽快定位bug,在发布Qt程序时,去掉debug打印,可以加快程序执行速度,减小程序体积。这时候我们如果手动注释qDebug就太麻烦了,可以使用宏来解决该问题,如下所示: 在pro文件里加上一行预定义宏即可。 12DEFINES += QT_NO_DEBUG_OUTPUT \ QT_NO_WARNING_OUTPUT
代码中的使用方式如下: 123456789101112131415161718#ifndef QT_DEBUGreturn 1;#elsereturn 0;#endif#ifndef QT_NO_DEBUG_STREAMQDebug operator