2012-05-04 3 views
3

Я хочу сделать фон QDialog прозрачным, чтобы я мог видеть через окно. Я спрашиваю, потому что я хочу использовать полупрозрачное фоновое изображение, которое создает иллюзию «закругленного углового окна». Использование setOpacity не является вариантом для меня, потому что я хочу, чтобы все виджеты оставались в полной непрозрачности.QDialog с прозрачным цветом фона

Есть ли способ достичь этого, не прибегая к использованию собственных API-интерфейсов ОС?

+0

возможно дубликат [A кварт виджета с полностью прозрачный фон] (http://stackoverflow.com/questions/4278723/a-qt-widget-with-fully-transparent-background) –

ответ

10

Использование QWidget::setAttribute(Qt::WA_TranslucentBackground);. Обратите внимание, что для этого также необходимо установить Qt::FramelessWindowHint.

Этот пример работает для меня:

#include <QtGui> 

class Dialog : public QDialog 
{ 
public: 
    Dialog() : QDialog(0, Qt::FramelessWindowHint) // hint is required on Windows 
    { 
     QPushButton *button = new QPushButton("Some Button", this);  
     setAttribute(Qt::WA_TranslucentBackground); 
    } 

}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Dialog d; 
    d.show(); 
    return a.exec(); 
} 

Что касается скругленных углов, QWidget::setMask() поможет.

EDIT: В ответ на другой вопрос ниже в комментариях, вот рабочий пример, который использует изображение в файле ресурсов, и приоритет QWidget::paintEvent():

#include <QtGui> 

class Dialog : public QDialog 
{ 
public: 
    Dialog() : QDialog(0, Qt::FramelessWindowHint) // hint is required on Windows 
    { 
     setFixedSize(500, 500); // size of the background image 
     QPushButton *button = new QPushButton("Some Button", this); 
     setAttribute(Qt::WA_TranslucentBackground); 
    } 

protected: 
    void paintEvent(QPaintEvent *event) 
    { 
     QPainter painter(this); 
     painter.drawImage(QRectF(0, 0, 500, 500), QImage(":/resources/image.png")); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Dialog d; 
    d.show(); 
    return a.exec(); 
} 
+0

Отлично работает, спасибо! – Pieter

+0

Я пытаюсь использовать это в сочетании с фоновым изображением, которое содержит полупрозрачные области, но я заметил, что фоновое изображение исчезает, когда я делаю фон полупрозрачным. Есть ли какие-то альтернативы, которые я должен рассмотреть? – Pieter

+2

@Pieter См. Правки. – Anthony

Смежные вопросы