Qt Lighthouse学习(三)

爱炯
2023-12-01

注:本文内容基于现阶段的Qt5源码,等Qt5正式发布时,本文的内容可能不再适用了。 2011.09.11

QPA插件加载

Qt5所有的gui程序都将依赖一个 qpa 插件(QGuiApplication初始化时将会加载qpa插件)。

  • 程序如何知道去哪儿找插件呢?
  • 又如何知道加载哪一个插件呢?

路径

  • 命令行参数:-platformpluginpath

  • 环境变量: QT_QPA_PLATFORM_PLUGIN_PATH

  • 常规插件路径(QCoreApplication::libraryPaths())下的platform子目录

    • 恩,常规路径很复杂,详见:Qt 插件路径(笔记)

    • QLibraryInfo::location(QLibraryInfo::PluginsPath)

      • 文件:/qt/etc/qt.conf中设置的路径
      • 环境变量:QT_PLUGIN_PATH
      • 编译Qt时生成的 src/corelib/global/config.cpp 中写死的路径
    • 可执行程序自身所在路径
    • 可执行程序路径下qt.conf设置的路径
    • 手动调用 QCoreApplication::addLibraryPath()设置的路径
    • 环境变量QT_QPA_PLATFORM_PLUGIN_PATH设置的路径以及-platformpluginpath指定的路径

插件名

  • 命令行参数:-platform

  • 环境变量:QT_QPA_PLATFORM

  • 编译Qt源码时定义的宏:QT_QPA_DEFAULT_PLATFORM_NAME

  • 默认插件名:
    • MAC 平台下的 “cocoa”
    • WIN 平台下的 “windows”
    • 其他 平台下 "xcb"

QWindow

QWidget和QApplication都从QtGui模块中移走了(移到了QtWidgets模块)。那么如何使用QtGui模块写一个最简单的界面呢?

需要使用 QWindow 和 QGuiApplication,一个简单的例子:

  • widget.h

#ifndef WINDOW_H
#define WINDOW_H

#include <QtGui/QWindow>
class Window : public QWindow
{
    Q_OBJECT
public:
    Window(QWindow *parent = 0);
protected:
    void exposeEvent(QExposeEvent *);
    void resizeEvent(QResizeEvent *);
private:
    void render();
    QBackingStore *m_backingStore;
};
#endif // WINDOW_H
  • window.cpp

#include "window.h"
#include <QtGui/QPainter>
#include <QtGui/QBackingStore>

Window::Window(QWindow *parent)
    : QWindow(parent)
{
    setGeometry(QRect(10, 10, 640, 480));
    m_backingStore = new QBackingStore(this);
}

void Window::exposeEvent(QExposeEvent *)
{
    render();
}

void Window::resizeEvent(QResizeEvent *)
{
    render();
}

void Window::render()
{
    QRect rect(QPoint(), geometry().size());
    m_backingStore->resize(rect.size());

    m_backingStore->beginPaint(rect);

    QPainter p(m_backingStore->paintDevice());
    p.drawRect(rect);

    m_backingStore->endPaint();
    m_backingStore->flush(rect);
}
  • main.cpp

#include <QtGui/QGuiApplication>
#include "window.h"

int main(int argc, char *argv[])
{
    QGuiApplication a(argc, argv);
    Window w;
    w.show();

    return a.exec();
}

 类似资料: