Bonjour à tous,

J'ai un problème avec Qt, je suis en train de suivre un tuto pour faire une fenêtre personnalisée et j'ai un problème car je n'arrive pas à faire fonctionner une fonction :

MainScreen.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
#ifndef MAINSCREEN_H
#define MAINSCREEN_H
 
#include <QtGui>
#include <QtWidgets>
 
#include <QWidget>
#include <QDesktopWidget>
#include <QGridLayout>
 
#include "TitleBar.h"
 
class MainScreen : public QWidget
{
    Q_OBJECT
 
    public:
        MainScreen(QWidget *parent = 0);
        ~MainScreen();
 
        void setTitle(const QString &title);
 
    signals:
        void windowTitleChanged();
 
    protected:
        void showEvent(QShowEvent *event);
        void paintEvent(QPaintEvent *event);
 
    private:
        void CenterOnScreen();
 
        TitleBar m_TitleBar;
 
        QGridLayout m_MainLayout;
};
 
#endif // MAINSCREEN_H
MainScreen.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
#include "MainScreen.h"
 
MainScreen::MainScreen(QWidget *parent) : QWidget(parent)
{
    connect(this, SIGNAL(windowTitleChanged()), &m_TitleBar, SLOT(UpdateTitle()));
 
    resize(512, 512);
    setTitle("Le titre !");
 
    setWindowFlags(Qt::FramelessWindowHint);
 
    m_MainLayout.setMargin(0);
    m_MainLayout.setSpacing(0);
    m_MainLayout.addWidget(&m_TitleBar, 0, 0, 1, 1);
    m_MainLayout.setRowStretch(1, 1);
 
    setLayout(&m_MainLayout);
}
 
MainScreen::~MainScreen()
{
 
}
 
void MainScreen::showEvent(QShowEvent *event)
{
    Q_UNUSED(event);
 
    CenterOnScreen();
}
 
void MainScreen::CenterOnScreen()
{
    QDesktopWidget screen;
 
    QRect screenGeom = screen.screenGeometry(this);
 
    int screenCenterX = screenGeom.center().x();
    int screenCenterY = screenGeom.center().y();
 
    move(screenCenterX - width() / 2, screenCenterY - height() / 2);
}
 
void MainScreen::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
 
    QPainter painter(this);
 
    QBrush background(QColor(23, 23, 34));
 
    painter.setBrush(background);
    painter.setPen(Qt::NoPen);
 
    painter.drawRect(0, 0, width(), height());
}
 
void MainScreen::setTitle(const QString &title)
{
    QWidget::setWindowTitle(title);
 
    emit windowTitleChanged();
}
TitleBar.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
#ifndef TITLEBAR_H
#define TITLEBAR_H
 
#include <QtGui>
#include <QtWidgets>
 
#include <QWidget>
#include <QPixmap>
#include <QLabel>
 
class TitleBar : public QWidget
{
    Q_OBJECT
 
    public:
        TitleBar(QWidget *parent = 0);
        ~TitleBar();
 
    public slots:
        void UpdateTitle();
 
    protected:
        void resizeEvent(QResizeEvent *event);
        void paintEvent(QPaintEvent *event);
 
    private:
        QPixmap *m_cache;
        QLabel *m_Title;
 
};
 
#endif // TITLEBAR_H
TitleBar.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
#include "TitleBar.h"
 
TitleBar::TitleBar(QWidget *parent) : QWidget(parent)
{
    m_cache = NULL;
    m_Title = new QLabel("", this);
 
    setFixedHeight(33);
    m_Title->setStyleSheet("color : white; font-family : Sans; font-weight : bold; font-size : 14px");
    UpdateTitle();
}
 
TitleBar::~TitleBar()
{
 
}
 
void TitleBar::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);
 
    delete m_cache;
 
    m_cache = new QPixmap(size());
 
    m_cache->fill(Qt::transparent);
 
    QPainter painter(m_cache);
 
    QColor lightBlue (177, 177, 203, 255);
    QColor gradientStart(0, 0, 0, 0);
    QColor gradientEnd (0, 0, 0, 220);
 
    QLinearGradient linearGrad(QPointF(0, 0), QPointF(0, height()));
    linearGrad.setColorAt(0, gradientStart);
    linearGrad.setColorAt(0, gradientEnd);
 
    // <--! Le cadre -->
    QPolygon frame;
 
    frame << QPoint(20, 4) << QPoint(width() - 4, 4) << QPoint(width() - 4, 32) << QPoint(4, 32) << QPoint(4, 20);
 
    painter.setPen(QPen(lightBlue));
    painter.setBrush(QBrush(linearGrad));
 
    painter.drawPolygon(frame);
    // <--! ######## -->
 
    // <--! La zone des boutons -->
    QPolygon buttons;
 
    buttons << QPoint(width() - 80, 4) << QPoint(width() - 4, 4) << QPoint(width() - 4, 32) << QPoint(width() - 88, 32) << QPoint(width() - 88, 12);
 
    painter.setPen(QPen(lightBlue));
    painter.setBrush(QBrush(lightBlue));
 
    painter.drawPolygon(buttons);
    // <--! ################### -->
 
    m_Title->move(28, 4);
    m_Title->resize(width() - 116, 29);
}
 
void TitleBar::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
 
    if(m_cache != NULL)
    {
        QPainter painter(this);
 
        painter.drawPixmap(0, 0, *m_cache);
    }
}
 
void TitleBar::UpdateTitle()
{
    m_Title->setText("window()->windowTitle()"); // la quand je mets les guillemets c'est bon le titre s'affiche mais si je les enlèves, et c'est ce que je veut faire et bien ça ne marche pas :(
}
Voilà je crois que je n'ai rien oublier, le main est juste la pour afficher le constructeur de MainScreen rien de plus.

Merci à ceux qui chercheront ou qui auront des idées constructives