Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink

Par contre merci quand même pour ta solution, elle me sera peut être utile un jour wink


Aelita, je te promet que l'ont pourra bientôt vivre tous les deux.
Je te le jure mon amour.

Hors ligne