5

別の QWidget の上にレンダリングされているように見える透明なフレームのない QWidget を作成したいと考えています。

私の意図は、DirectXQtを使用して 3D ゲームの上にHUDを作成することです。

これまでの私の取り組みでは、私の QMainWindow には、DirectX でスワップ チェーンを作成するときに通常の QWidget の HWND を DirectX に渡すことによって作成されたカスタムの DirectX-Widget が含まれており、QTimer を使用してカスタム レンダー ループを作成します (コードを参照)。以下)。

次に、QMainWindow の上に新しいOverlay -widget (意図した HUD) をレンダリングして、それがメイン ウィンドウの一部であるかのように見せようとします。

オーバーレイで次のフラグを使用することで、希望どおりに動作させることができますが、それでもフレームを取り除くことはできません。

setWindowFlags(Qt::WindowStaysOnBottomHint);
setAttribute(Qt::WA_TranslucentBackground, true);
setAttribute(Qt::WA_TransparentForMouseEvents);

の画像は、実際にどのように見えるかを示しています。の画像は、MS ペイントの魔法により、私が望んでいる方法です。

デバッグ画像

写真からわかるように、透明度はDirectX ウィジェットの上では機能しませんが、ツールバーなどの通常のウィジェットの上では機能しているように見えます。 DirectX の代わりに。

なぜこれが起こっているのか誰にも分かりますか?DirectX でフレームを取り除く方法、または同様のことを達成する方法について何か提案はありますか?


ソースコード

ここから完全なVisual Studio 2010プロジェクトをダウンロードできます。

自分でコンパイルする場合は、おそらくQt4 用の Visual Studio アドイン 1.1.112010 年 6 月の DirectX SDKが必要です。

ソースコードの大部分も以下に示します。できるだけ短くするようにしました。

#pragma once

#include <QtGui/QMainWindow>
#include <QtCore/QTimer>
#include "ui_mainwindow.h"
#include "ui_overlay.h"

class DXWidget : public QWidget
{
    Q_OBJECT
private:
    QTimer* timer;
public:
    DXWidget(QWidget* parent) : QWidget(parent){}
    ~DXWidget()
    {
        // dx cleanup
    };
    void init(HWND windowHandle)
    {
        // init DirectX using our HWND as render target
        initDX(windowHandle);

        // start render loop
        timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(render()));
        timer->start(0);
    }
private:
    void initDX(HWND windowHandle)
    {
        // inits DirectX stuff
    }
private slots:
    void render()
    {
        // renders a frame to the Widget using DirectX
    }
};

class Overlay : public QMainWindow
{
    Q_OBJECT
private:
    Ui::Overlay ui;
public:
    Overlay(QWidget* parent) : QMainWindow(parent)
    {
        ui.setupUi(this);
        QWidget::setWindowFlags(Qt::WindowStaysOnBottomHint);
        QWidget::setAttribute(Qt::WA_TranslucentBackground, true);
        show();
        move(6, 50); // move window so we can see it overlapping our toolbar
    };
    ~Overlay()
    {
    };
};


class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    Ui::MainWindowClass ui;
    DXWidget* widget;
public:
    MainWindow()
    {
        // setup window
        ui.setupUi(this);

        // create DirectX-widget
        widget = new DXWidget(this);
        MainWindow::setCentralWidget(widget);

        // hand HWND to DirectXs swap chain so
        // we can draw to that window
        widget->init(widget->winId());

        // create overlay
        new Overlay(this);
    };
};
4

0 に答える 0