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 :
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 #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
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
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.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 #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
Voilà je crois que je n'ai rien oublier, le main est juste la pour afficher le constructeur de MainScreen rien de plus.
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 :( }
Merci à ceux qui chercheront ou qui auront des idées constructives![]()
Partager