2

デスクトップカルーセルアプリを作成しています。そこで、他のサブウィジェットも含む可能性のある画像ウィジェットを表示する必要があります。そのためにQFrame、必要な画像を背景として使用しています。これが私が使用しようとしている画像です: image link。私が望むのは、画像のみが表示され、背景画像や何も表示されないため、ユーザーには画像だけのように見えることです. これが私のコードです:

setGeometry(QRect(100, 20, 325,400));
setFrameStyle(QFrame::StyledPanel);
setStyleSheet("QFrame#ImageFrame { background-color: transparent; background: url(:icon/ipad-skin); }");
setAutoFillBackground(false);

しかし、私は結果としてこれを得ています:

ここに画像の説明を入力

私もこれを試しました(hereから取得)(およびスタイルシートを削除します):

void MyWidget::paintEvent(QPaintEvent *p)
{
    QPainter* pPainter = new QPainter(this);
    pPainter->drawPixmap(rect(), QPixmap(":icon/newskin.png"));
    delete pPainter;
    QWidget::paintEvent(p);
}

何も変わらず、まったく同じ結果です。背景の灰色はまだ表示されます。

Goの灰色の背景を作成して画像のみを表示するにはどうすればよいですかQFrame(設定している寸法は画像と同じです)。

PS 同様の質問がここで回答されていることを認識しています: QWidget transparent background (but not the children)、およびここ: Frameless and transparent window qt5しかし、これらは私の問題を解決しません。最後の解決策は、私の QFrame を次のようにします。

ここに画像の説明を入力

QFrame には、そもそも私が望んでいたものとはまったく異なるタイトル バーが付属しています。

編集- このソリューションは機能しますが、私のユースケースでは、QFrame 内の GL を介してレンダリングされた画像を表示する必要があります (具体的には、ここに表示されている iPad 画像内のビューポート)。Windows では、Qt::WA_TranslucentBackgroundプロパティを設定すると、GL でレンダリングされたイメージが非表示になります。ただし、Macでは問題なく動作します。そのため、Windows でも機能するソリューションを探しています。

4

2 に答える 2

6

このコードは私にとってはうまくいきます (Qt 5.5.0-beta を使用して、MacOS/X 10.10.3 でテストされました。ただし、Qt バージョン 4.5.0 以降で動作することを期待しています):

main.h:

#ifndef main_h
#define main_h

#include <QFrame>
#include <QPixmap>

class MyFrame : public QFrame
{
public:
   MyFrame(QWidget * parent);

   virtual void paintEvent(QPaintEvent * e);

private:
   QPixmap _pixmap;
};

#endif

main.cpp:

#include <QApplication>
#include <QPainter>
#include "main.h"

MyFrame :: MyFrame(QWidget * parent) : QFrame(parent, Qt::Window|Qt::FramelessWindowHint)
{
   setAttribute(Qt::WA_TranslucentBackground);

   _pixmap.load("/Users/jaf/iPad_Vector.png");
   resize(_pixmap.size());
}

void MyFrame :: paintEvent(QPaintEvent * /*e*/)
{
   QPainter p(this);
   p.drawPixmap(0,0,width(),height(), _pixmap);
}

int main(int argc, char ** argv)
{
   QApplication app(argc, argv);

   MyFrame f(NULL);
   f.show();

   return app.exec();
}

スクリーンショット (デスクトップの背景の前にアプリのウィンドウを表示):

スクリーンショット

于 2015-06-23T18:35:41.290 に答える
1

この軽い修正をあなたのコードに試してみませんか?

うまくいかない場合、コンパイル可能なコードを公開リポジトリに公開できますか? これは、正確なコンテキストで再現するのに役立ちます。

void MyWidget::paintEvent(QPaintEvent *p)
{
    QPainter* pPainter = new QPainter(this);
    pPainter->setBackgroundMode(Qt::TransparentMode);
    pPainter->drawPixmap(rect(), QPixmap(":icon/newskin.png"));
    delete pPainter;
    QWidget::paintEvent(p);
}
于 2015-06-23T15:57:41.113 に答える