#1 Le 09/10/2008, à 20:10
- otheym
[Résolu] [QT] StatusBar et QTabWidget
Bonsoir,
Dans mon programme, je dois pouvoir écrire du texte et la StatusBar indique ligne et colonne.
Mais voila, j'ai 4 onglets avec dedans un QTextEdit.
Le soucis étant que j'ai uniquement une mise à jour de la StatusBar quand j'écris dans le QTextEdit du premier onglet, les autres ça fonctionne pas.
Voici le code :
QFicEditor.h :
#ifndef __QFICEDITOR_H__
#define __QFICEDITOR_H__
#include <QtGui>
class QFicEditor : public QMainWindow
{
Q_OBJECT
private slots:
void updateColsRows();
void changeCurrentIndex(int index);
private:
/*Menu Fichier*/
QMenu *fileMenu;
QMenu *exportFileMenu;
QAction *actionNew;
QAction *actionOpen;
QAction *actionSave;
QAction *actionSaveAs;
QAction *actionExportTextFormat;
QAction *actionExit;
/*Le corps de l'appli*/
QTabWidget *tabBar;
QVBoxLayout *layout;
QWidget *pageFicEditor;
QTextEdit *textFic;
QWidget *createPage();
QLabel *labelCols;
void createMenus(); //Les menus
void createMenuFile(); //Menu Fichier
QTextEdit *getTabTextActual(); //Récupère le QTextEdit de l'onglet
void updateColsRows(int rows, int cols);
public:
QFicEditor();
~QFicEditor();
};
#endif
QFicEditor.cpp :
#include "QFicEditor.h"
QFicEditor::QFicEditor()
{
setWindowTitle("FicEditor"); //Titre
setMinimumSize(640, 480); //Taille minimale
createMenus();
/*Affiche le corps du programme*/
tabBar = new QTabWidget;
int tabFic = tabBar->addTab(createPage(), tr("FicEditor"));
int tabCharacter = tabBar->addTab(createPage(), tr("Personnages"));
int tabPlace = tabBar->addTab(createPage(), tr("Lieux"));
int tabIdea = tabBar->addTab(createPage(), trUtf8("Idées"));
tabBar->setCurrentIndex(tabFic);
setCentralWidget(tabBar);
connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(changeCurrentIndex(int)));
/*Crée un QLabel, inscrit la colone et ligne et l'ajoute au QStatusBar*/
labelCols = new QLabel;
updateColsRows(1, 1);
statusBar()->addWidget(labelCols);
connect(getTabTextActual(), SIGNAL(cursorPositionChanged()),
this, SLOT(updateColsRows()));
}
QFicEditor::~QFicEditor()
{
delete tabBar;
}
/*Ajoute un nouvel onglet de travaille*/
QWidget *QFicEditor::createPage()
{
QWidget *pageFicEditor = new QWidget;
QTextEdit *textFic = new QTextEdit;
QVBoxLayout *layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0); //Marges du layout
layout->addWidget(textFic); //Ajoute le widget
pageFicEditor->setLayout(layout);
tabBar->setContentsMargins(0, 0, 0, 0);
return pageFicEditor;
}
/*Met à jour colone et ligne dans le QStatusBar*/
void QFicEditor::updateColsRows(int rows, int cols)
{
/*Convertis le int en QString*/
QString numCols;
QString numRows;
numCols.setNum(cols);
numRows.setNum(rows);
QString textRows = tr("lignes ")+numRows;
QString textCols = tr(" : Cols ")+numCols;
labelCols->setText(textRows+textCols);
}
/*Slot de mise à jour lignes et colonnes*/
void QFicEditor::updateColsRows()
{
QTextCursor textCursor = getTabTextActual()->textCursor();
int lines = 0;
for (int i = 0; i < textCursor.position(); i++)
{
if (getTabTextActual()->toPlainText()[i] == '\n')
{
lines++;
}
}
lines++;
updateColsRows(lines, textCursor.columnNumber()+1);
}
/*Slot de changement de l'index courant de notre tab*/
void QFicEditor::changeCurrentIndex(int index)
{
tabBar->setCurrentIndex(index);
}
/*Crée les menus*/
void QFicEditor::createMenus()
{
createMenuFile();
}
/*Crée le menu Fichier*/
void QFicEditor::createMenuFile()
{
QMenu *fileMenu = menuBar()->addMenu(tr("&Fichier"));
QAction *actionNew = new QAction(tr("&Nouveau"), this);
actionNew->setShortcut(tr("Ctrl+N"));
QAction *actionOpen = new QAction(tr("&Ouvrir"), this);
actionOpen->setShortcut(tr("Ctrl+O"));
QAction *actionSave = new QAction(tr("&Enregistrer"), this);
actionSave->setShortcut(tr("Ctrl+S"));
QAction *actionSaveAs = new QAction(tr("Enregistrer &sous"), this);
QMenu *exportFileMenu = new QMenu(tr("Exporter"), this);
QAction *actionExportTextFormat = new QAction(tr("&Fichier texte BBCode"), this);
QAction *actionExit = new QAction(tr("&Quitter"), this);
actionExit->setShortcut(tr("Ctrl+Q"));
connect(actionExit, SIGNAL(triggered()), qApp, SLOT(quit()));
exportFileMenu->addAction(actionExportTextFormat);
fileMenu->addAction(actionNew);
fileMenu->addAction(actionOpen);
fileMenu->addAction(actionSave);
fileMenu->addAction(actionSaveAs);
fileMenu->addSeparator();
fileMenu->addMenu(exportFileMenu);
fileMenu->addAction(actionExit);
}
QTextEdit *QFicEditor::getTabTextActual()
{
return tabBar->currentWidget()->findChild<QTextEdit *>();
}
Merci d'avance à ceux qui pourront m'aider.
Dernière modification par otheym (Le 11/10/2008, à 17:32)
Aelita, je te promet que l'ont pourra bientôt vivre tous les deux.
Je te le jure mon amour.
Hors ligne
#2 Le 10/10/2008, à 01:32
- obiwankennedy
Re : [Résolu] [QT] StatusBar et QTabWidget
Il est un peu tard pour moi là. Il semble que tu mettes à jour manuellement un QlineEdit qui est dans la statutbar. Pourquoi ne pas utiliser un signal/slot ?
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne
#3 Le 10/10/2008, à 06:30
- otheym
Re : [Résolu] [QT] StatusBar et QTabWidget
Dans la StatusBar c'est un QLabel que je met à jour, mais via un signal/slot de ma composition.
Je comprend pas ce que tu veux dire.
Aelita, je te promet que l'ont pourra bientôt vivre tous les deux.
Je te le jure mon amour.
Hors ligne
#4 Le 10/10/2008, à 11:55
- obiwankennedy
Re : [Résolu] [QT] StatusBar et QTabWidget
c'était tard, mais en je comprends pas le besoin d'ajouter un label alors que la gestion par défaut de la statut bar est assez proche d'un label.
Moi je ferai juste : statusBar()->showMessage(textRows+textCols);
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne
#5 Le 10/10/2008, à 15:37
- otheym
Re : [Résolu] [QT] StatusBar et QTabWidget
Le showMessage affiche un message permanent, hors je compte pouvoir afficher un message temporaire dans la statusbar quand on pointe la souris sur un menu (pas encore géré car je bloque sur mon truc).
Mais dans tous les cas, cela résoud pas le problème, la MAJ se fait que sur le premier onglet et non les autres.
Aelita, je te promet que l'ont pourra bientôt vivre tous les deux.
Je te le jure mon amour.
Hors ligne
#6 Le 10/10/2008, à 16:10
- obiwankennedy
Re : [Résolu] [QT] StatusBar et QTabWidget
faux... si tu donnes un chiffre statusBar()->showMessage(textRows+textCols,2000); derrière le message restera 2 secs sinon tu peux appeller "clerMessage" qui efface le contenu de la statut bar.
Enfin je pense avoir trouver: (pas sur)
tu fais
"connect(getTabTextActual(), SIGNAL(cursorPositionChanged()), this, SLOT(updateColsRows()));"
dans le constructeur.
Hors comme tu le fais dans le constructeur forcement la connection n'est qu'entre l'onglet actuel au moment du lancement. Donc il faudrait que tu mettes un connect pour chaque onglet ou que ça soit le tabBar qui centralise les signaux.
Dernière modification par obiwankennedy (Le 10/10/2008, à 16:14)
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne
#7 Le 10/10/2008, à 16:27
- otheym
Re : [Résolu] [QT] StatusBar et QTabWidget
Je fais comment pour la centralisation des signaux ?
Aelita, je te promet que l'ont pourra bientôt vivre tous les deux.
Je te le jure mon amour.
Hors ligne
#8 Le 11/10/2008, à 11:51
- obiwankennedy
Re : [Résolu] [QT] StatusBar et QTabWidget
Quand je dis "centraliser" c'est une façon de parler. Ce n'est pas une technique spécifique.
Donc tu crées une classe qui hérite de QTabWidget.
Tu redéfinis quelques fonctions comme :addTab()
int my_own_Tab::addTab ( QWidget * page, const QString & label )
{
connect(page, SIGNAL(cursorPositionChanged()), this, SiGNAL(updateColsRows()));
QTabWidget::addTab(page,label);
}
Avec ça, tu es sur d'être connecté avec tous tes onglets.
Ensuite dans ta classe "my_own_Tab" tu ajoutes un signal "updateColsRows" (bien sûr tu dois changer les noms pour de lisibilité).
et dans la classe mainWindow.
tu changes
QTabWidget *tabBar; par my_own_Tab *tabBar; //fichier .h
tabBar = new my_own_Tab;//fichier .cpp
//et tu ajoutes
connect(tabBar, SIGNAL(updateColsRows), this, SLOT(updateColsRows()));
Et voilà, tous les onglets envoient le signal vers le Tabwidget qui lui même les renvoyer à la fenêtre principale.
Dernière modification par obiwankennedy (Le 11/10/2008, à 11:51)
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne
#9 Le 11/10/2008, à 17:32
- otheym
Re : [Résolu] [QT] StatusBar et QTabWidget
Salut,
C'est bon j'ai résolu mon problème, il fallait que je retire mon connect avec la fonction getTabTextActual() et à la place que je le mette dans le createPage (au lieu de la fonction getTabTextActual(), je met directement l'ID de mon QTabWidget.
Et Maintenant cela fonctionne impec
Par contre merci quand même pour ta solution, elle me sera peut être utile un jour
Aelita, je te promet que l'ont pourra bientôt vivre tous les deux.
Je te le jure mon amour.
Hors ligne