2013-08-19 48 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 QT 5.0.2(64位) Qt Creator的2.7.1

就像我刚才说我在这一点,不要很新”不知道我错过了什么才能正常工作。任何人可以提供的援助将不胜感激。

+0

我很抱歉,谢谢你让我知道了正确的程序。 – Caveman

+0

没问题,很高兴我能帮到你!有了这个质量的问题,你会得到代表。立即注册,不用担心:-)关于这些网站如何在[帮助]部分或[常见问题](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

我试图upvote的答案,但我没有足够的代表尚未。有人请为duDE回答我的答案,因为这非常有帮助。 – Caveman

+2

当我加入 “setAttribute(Qt :: WA_PaintOnScreen);” 到你的答案的底部,它完美的作品。再次感谢。 – Caveman