2013-08-19 2 views
20

Я довольно новичок в qt и C++, и я столкнулся с проблемой, которую я не могу понять. Я хочу открыть бескаркасное и прозрачное окно, когда я нажимаю кнопку на основном ui. У меня есть код для открытия нового окна, когда я нажимаю кнопку на основном ui, но я не могу заставить работать без рамки и прозрачности.Безрамное и прозрачное окно qt5

Вот исходные коды для маленькой программы, которую я написал, чтобы узнать эту

main.cpp

#include "learnwindow.h" 
#include <QApplication> 

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

    return a.exec(); 
} 

Вот LearnWindow.h

#ifndef LEARNWINDOW_H 
#define LEARNWINDOW_H 

#include <QMainWindow> 
#include <transwindow.h> 

namespace Ui { 
class LearnWindow; 
} 

class LearnWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit LearnWindow(QWidget *parent = 0); 
    ~LearnWindow(); 

private slots: 
    void on_pushButton_clicked(); 

private: 
    Ui::LearnWindow *ui; 
    TransWindow *winTrans; 

public slots: 
    void openTrans(); 
}; 

#endif // LEARNWINDOW_H 

Вот learnwindow. cpp

#include "learnwindow.h" 
#include "ui_learnwindow.h" 

LearnWindow::LearnWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::LearnWindow) 
{ 
    ui->setupUi(this); 
} 

LearnWindow::~LearnWindow() 
{ 
    delete ui; 
} 

void LearnWindow::openTrans() 
{ 
    winTrans = new TransWindow (this); 
    //winTrans->setWindowTitle("NewWin"); 
    // winTrans->setWindowFlags(Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint); 
    //winTrans->setAttribute(Qt::WA_TranslucentBackground,true); 
    //winTrans->setAutoFillBackground(false); 
    //winTrans->setStyleSheet("background:transparent;"); 
    winTrans->show(); 
} 

void LearnWindow::on_pushButton_clicked() 
{ 
    openTrans(); 
} 

Вот transwindow.h

#ifndef TRANSWINDOW_H 
#define TRANSWINDOW_H 

#include <QDialog> 

namespace Ui { 
class TransWindow; 
} 

class TransWindow : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit TransWindow(QWidget *parent = 0); 

    //setWindowFlags(windowFlags()| Qt::FramelessWindowHint); 

    ~TransWindow(); 

private: 
    Ui::TransWindow *ui; 
}; 

#endif // TRANSWINDOW_H 

А вот transwindow.cpp

#include "transwindow.h" 
#include "ui_transwindow.h" 

TransWindow::TransWindow(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::TransWindow) 
{ 
    //setWindowTitle("NewWin"); 
    //setWindowFlags(Qt::FramelessWindowHint); 
    //setAttribute(Qt::WA_TranslucentBackground,true); 
    ui->setupUi(this); 
} 

TransWindow::~TransWindow() 
{ 
    delete ui; 
} 

В разных исходных кодах вы увидите закомментированные линии, которые являются различными вещами, которые я пробовал. По большей части проблема заключается в том, что если я не комментирую какую-либо строку, пытающуюся установить «Qt :: FramlessWindowHint», программа работает нормально, но никогда не открывает новое окно, когда я нажимаю кнопку на основном ui.

Если я не комментирую какую-либо строку, где я устанавливаю «Qt :: WA_TranslucentBackground», откроется новое окно, когда кнопка нажата в главном ui, но фон нового окна черный, не прозрачный.

Другая информация, которая может быть уместна: Linux: ubunto 12,04 кварты 5.0.2 (64-разрядная версия) Qt Creator 2.7.1

Как я уже говорил ранее, я совсем новичок в этом и Дон» я точно понимаю, что мне не хватает, чтобы сделать эту работу должным образом. Любая помощь, которую любой может предоставить, будет очень признательна.

+0

Извиняюсь, спасибо за давая мне знать правильную процедуру. – Caveman

+0

Без проблем, рад, что я мог бы помочь! С вопросами такого качества вы получите репутацию. для того, чтобы быстро продвигаться вперед, не беспокойтесь об этом :-) Там много материала о том, как эти сайты работают в разделе [help], или в [FAQ] (http://meta.stackexchange.com/questions/ 7931/faq-for-stack-exchange-sites) на странице [meta], если вы ищете информацию. – Mat

ответ

33

Попробуйте это:

setWindowFlags(Qt::Widget | Qt::FramelessWindowHint); 
setParent(0); // Create TopLevel-Widget 
setAttribute(Qt::WA_NoSystemBackground, true); 
setAttribute(Qt::WA_TranslucentBackground, true); 
setAttribute(Qt::WA_PaintOnScreen); // not needed in Qt 5.2 and up 
+3

Это решило часть проблемы. Я поместил код, который вы указали, в transwindow.cpp, и теперь открывается бескаркасное окно, но оно все еще имеет черный фон. Хм, мне нужно будет еще немного почитать и подумать о последней части. Спасибо за решение первой половины проблемы. – Caveman

+1

Я попытался ответить, но у меня пока нет достаточного количества репутации. Кто-то, пожалуйста, поддержите ответ duDE для меня, потому что это было очень полезно. – Caveman

+2

Когда я добавил "setAttribute (Qt :: WA_PaintOnScreen);" В нижней части вашего ответа он работает отлично. Еще раз спасибо. – Caveman

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