2013-08-19 15 views
20

Sono abbastanza nuovo per qt e C++ e ho riscontrato un problema che non riesco a capire. Sto volendo aprire una finestra frameless e trasparente quando clicco su un pulsante sull'interfaccia utente principale. Ho il codice che funziona per aprire una nuova finestra quando premo un pulsante sull'interfaccia utente principale ma non riesco a far funzionare la parte frameless e trasparente.Finestra senza cornice e trasparente qt5

Ecco i codici sorgente per il piccolo programma che ho scritto per imparare questo

main.cpp

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

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

    return a.exec(); 
} 

Ecco l'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 

Ecco 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(); 
} 

Ecco la 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 

E qui è 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; 
} 

Nei vari codici sorgente si vede come commento linee che è le diverse cose che ho provato. Per la maggior parte il problema è che se non annullo nessuna riga che tenta di impostare "Qt :: FramlessWindowHint", il programma viene eseguito normalmente ma non apre mai una nuova finestra quando faccio clic sul pulsante sull'interfaccia utente principale.

Se non annullo alcuna riga in cui viene impostato "Qt :: WA_TranslucentBackground", la nuova finestra si aprirà quando viene premuto il pulsante nell'interfaccia utente principale, ma lo sfondo della nuova finestra è nero, non trasparente.

Altre informazioni che possono essere pertinenti: linux: Ubunto 12.04 5.0.2 qt (64-bit) Qt Creator 2.7.1

Come ho detto in precedenza Sono abbastanza nuovo a questo e don' t capire esattamente cosa mi manca per farlo funzionare correttamente. Qualsiasi assistenza che chiunque può fornire sarebbe molto apprezzata.

+0

Mi scuso, grazie per avermi permesso di conoscere la procedura corretta. – Caveman

+0

Nessun problema, felice di poterti aiutare! Con domande di tale qualità, riceverai il rappresentante. per cambiare pagina in poco tempo, non ti preoccupare :-) Ci sono molte cose su come questi siti funzionano nella sezione [aiuto], o nelle [FAQ] (http://meta.stackexchange.com/questions/ 7931/faq-for-stack-exchange-sites) su [meta] se stai cercando informazioni. – Mat

risposta

33

Prova questo:

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

Ha risolto parte del problema. Inserisco il codice che hai elencato, in transwindow.cpp e ora la finestra frameless si apre, ma ha ancora uno sfondo nero. Hmm, dovrò fare ancora un po 'di lettura e di riflessione sull'ultima parte. Grazie per aver risolto la prima metà del problema. – Caveman

+1

Ho provato a cambiare la risposta, ma non ho ancora abbastanza rep. Qualcuno per favore invertire la risposta di duDE per me perché è stato molto utile. – Caveman

+2

Quando ho aggiunto "setAttribute (Qt :: WA_PaintOnScreen);" Alla fine della tua risposta, funziona perfettamente. Grazie ancora. – Caveman

Problemi correlati