Toolbar Qt

Toolbar Qt - C++ - Programmation

Marsh Posté le 10-11-2016 à 20:39:55    

Bonjour, j'utilise Qt et je dois faire une toolbar un peu comme celle de l'explorateur windows sous la barre de menu (je suis sous Windows 7 mais je pense que c'est la meme chose sur les versions posterieures)  c'est a dire que quand on reduit la largeur de la fenetre, les icones qui n'ont plus la place de s'afficher son cachees automatiquement et placees dans une liste deroulante disponible en cliquant sur une fleche qui apparait alors sur la toolbar. Est-ce que vous savez si il existe une classe toute faite avec Qt ou dois-je tout coder a partir de zero ? Merci.

Reply

Marsh Posté le 10-11-2016 à 20:39:55   

Reply

Marsh Posté le 14-11-2016 à 20:47:59    

Personne n'a d'idee ? Bon j'ai recopie un code qui fonctionne :

 
Code :
  1. #include <QApplication>
  2. #include <QAction>
  3. #include <QMainWindow>
  4. #include <QLineEdit>
  5. #include <QToolBar>
  6. #include <QHBoxLayout>
  7. void initWindow(QMainWindow* w);
  8. int main(int argc, char *argv[])
  9. {
  10.     Q_INIT_RESOURCE(application);
  11.     QApplication app(argc, argv);
  12.     QMainWindow mainWin;
  13.     initWindow(&mainWin);
  14.     mainWin.show();
  15.     return app.exec();
  16. }
  17. void initWindow(QMainWindow* w)
  18. {
  19.     QLineEdit* searchBar = new QLineEdit;
  20.     QAction* newAct = new QAction(QIcon(":/images/new.png" ), "&New", w);
  21.     newAct->setShortcuts(QKeySequence::New);
  22.     QAction* openAct = new QAction(QIcon(":/images/open.png" ), "&Open...", w);
  23.     openAct->setShortcuts(QKeySequence::Open);
  24.     QAction* saveAct = new QAction(QIcon(":/images/save.png" ), "&Save", w);
  25.     saveAct->setShortcuts(QKeySequence::Save);
  26.     QAction* cutAct = new QAction(QIcon(":/images/cut.png" ), "Cu&t", w);
  27.     cutAct->setShortcuts(QKeySequence::Cut);
  28.     QAction* copyAct = new QAction(QIcon(":/images/copy.png" ), "&Copy", w);
  29.     copyAct->setShortcuts(QKeySequence::Copy);
  30.     QAction* pasteAct = new QAction(QIcon(":/images/paste.png" ), "&Paste", w);
  31.     pasteAct->setShortcuts(QKeySequence::Paste);
  32.     QToolBar* fileToolBar = w->addToolBar("File" );
  33.     fileToolBar->addAction(newAct);
  34.     fileToolBar->addAction(openAct);
  35.     fileToolBar->addAction(saveAct);
  36.     QToolBar* editToolBar = w->addToolBar("Edit" );
  37.     editToolBar->addAction(cutAct);
  38.     editToolBar->addAction(copyAct);
  39.     editToolBar->addAction(pasteAct);
  40.     editToolBar->addWidget(searchBar);
  41. }
 


mais le probleme c'est que ca ne marche que pour des toolbar dans une QMainWindow. Or dans le code sur lequel je travaille je dois faire ca dans un QWidget et je ne peux donc pas ajouter de toolbar directement en appelant la methode "addToolbar" mais en passant par un layout. Voici le code de test que j'ai tape pour reproduire la situation dans laquelle je me trouve :

 
Code :
  1. #include <QApplication>
  2. #include <QtGui/QWindow>
  3. #include <QToolbar>
  4. #include <QVBoxLayout>
  5. #include <QMainWindow>
  6. #include <QPushButton>
  7. #include <QAction>
  8. #include <QIcon>
  9. #include <QLineEdit>
  10. int main(int argc, char *argv[])
  11. {
  12.     QApplication app(argc, argv);
  13.     QWidget* w = new QWidget;
  14.     QHBoxLayout* tb1 = new QHBoxLayout;
  15.     tb1->addWidget(new QPushButton("item11" ));
  16.     tb1->addWidget(new QPushButton("item12" ));
  17.     tb1->addWidget(new QPushButton("item13" ));
  18.     tb1->addWidget(new QPushButton("item14" ));
  19.     QHBoxLayout* spacerLayout = new QHBoxLayout;
  20.     spacerLayout->addSpacerItem(new QSpacerItem(50, 20, QSizePolicy::MinimumExpanding,QSizePolicy::Fixed) );
  21.     spacerLayout->setAlignment(Qt::AlignJustify);
  22.     QWidget* sep = new QWidget;
  23.     QRect rect = sep->geometry();
  24.     rect.setWidth(0);
  25.     sep->setGeometry(rect);
  26.     QToolBar* tb3 = new QToolBar;
  27.     QLineEdit* searchBar = new QLineEdit;
  28.     QAction* item31 = new QAction(QIcon(":/images/cut.png" ), "cut" );
  29.     QAction* item32 = new QAction(QIcon(":/images/copy.png" ), "copy" );
  30.     QAction* item33 = new QAction(QIcon(":/images/open.png" ), "open" );
  31.     QAction* item34 = new QAction(QIcon(":/images/paste.png" ), "past" );
  32.     QAction* item35 = new QAction(QIcon(":/images/save.png" ), "save" );
  33.     tb3->addWidget(sep);
  34.     tb3->addWidget(searchBar);
  35.     tb3->addAction(item31);
  36.     tb3->addAction(item32);
  37.     tb3->addAction(item33);
  38.     tb3->addAction(item34);
  39.     tb3->addAction(item35);
  40.     QVBoxLayout* mainLayout = new QVBoxLayout;
  41.     QHBoxLayout* topLayout = new QHBoxLayout;
  42.     topLayout->addLayout(tb1);
  43.     topLayout->addLayout(spacerLayout);
  44.     topLayout->addWidget(tb3);
  45.     QHBoxLayout* bottomLayout = new QHBoxLayout;
  46.     bottomLayout->addWidget(new QPushButton);
  47.     mainLayout->addLayout(topLayout);
  48.     mainLayout->addLayout(bottomLayout);
  49.     w->setLayout(mainLayout);
  50.     w->show();
  51.     return app.exec();
  52. }
 

Ca fonctionne bien pour les QAction mais pas pour la QLineEdit, c'est a dire que lorsque je clique sur la fleche pour afficher la liste des widgets qui ont ete cachees apres avoir reduit la largeur de la fenetre, je vois tous les QAction mais pas le QLineEdit.

 

Quelqu'un aurait une idee d'ou vient le probleme ? Merci.

 

Edit : Pour mieux visualiser la chose j'ai fais des captures ecrans de mon 2eme test :

 

Avant redimensionnement :

 

http://img4.hostingpics.net/pics/224120tb1.jpg

 

Apres avoir redimensionne, les icones en trop disparaissent, je clique donc sur la fleche pour les afficher dans la liste deroulante : elles s'affichent toutes sauf la QLineEdit :

 


http://img4.hostingpics.net/pics/903380tb2.jpg


Message édité par petipoi le 15-11-2016 à 15:30:42
Reply

Marsh Posté le 21-11-2016 à 20:38:48    

Bon après quelques recherches je me suis rendu compte que c'etait une particularite de Qt, c'est a dire que lorsque la QTooBar n'est pas dans une QMainWindow elle perd certaines de ses fonctionnalites :
 

Citation :

When a QToolBar is not a child of a QMainWindow, it loses the ability to populate the extension pop up with widgets added to the toolbar using addWidget(). Please use widget actions created by inheriting QWidgetAction and implementing QWidgetAction::createWidget() instead.


 
Du coup j'ai cree des classes derivant de QWidgetAction pour chaque QWidget (en creant a chaque fois le widget specifique dans createWidget() ) et ca marche correctement. Voici le code :
 
main.cpp :  
 

Code :
  1. #include <QApplication>
  2. #include <QtGui/QWindow>
  3. #include <QToolbar>
  4. #include <QVBoxLayout>
  5. #include <QMainWindow>
  6. #include <QPushButton>
  7. #include <QAction>
  8. #include <QIcon>
  9. #include <QLineEdit>
  10. #include <QSlider>
  11. #include <QVariant>
  12. #include <QCheckBox>
  13. #include <QWidgetAction>
  14. #include "QMyWidgetAction.h"
  15. void test2(QApplication& app);
  16. int main(int argc, char *argv[])
  17. {
  18.     QApplication app(argc, argv);
  19.     test2(app);
  20.     return app.exec();
  21. }
  22. void test2(QApplication& app)
  23. {
  24.     QWidget* w = new QWidget;
  25.     QHBoxLayout* l1 = new QHBoxLayout;
  26.     l1->addWidget(new QPushButton("item11" ));
  27.     l1->addWidget(new QPushButton("item12" ));
  28.     l1->addWidget(new QPushButton("item13" ));
  29.     l1->addWidget(new QPushButton("item14" ));
  30.     QHBoxLayout* l2 = new QHBoxLayout;
  31.     l2->addSpacerItem(new QSpacerItem(50, 20, QSizePolicy::MinimumExpanding,QSizePolicy::Fixed) );
  32.     l2->setAlignment(Qt::AlignJustify);
  33.     QHBoxLayout* l3 = new QHBoxLayout;
  34.     QToolBar* tb = new QToolBar;
  35.     l3->addWidget(tb);
  36.     QAction* item31 = new QAction(QIcon(":/images/cut.png" ), "cut" );
  37.     QAction* item32 = new QAction(QIcon(":/images/copy.png" ), "copy" );
  38.     QAction* item33 = new QAction(QIcon(":/images/open.png" ), "open" );
  39.     QAction* item34 = new QAction(QIcon(":/images/paste.png" ), "past" );
  40.     QAction* item35 = new QAction(QIcon(":/images/save.png" ), "save" );
  41.     QLineEdit* searchBar = new QLineEdit;
  42.     QMyWidgetAction* widgetAction = new QMyWidgetAction(tb);
  43.     QLineEditAction* lineEditAction = new QLineEditAction(tb);
  44.     tb->addSeparator();
  45.     tb->addWidget(searchBar);
  46.     tb->addAction(item31);
  47.     tb->addAction(item32);
  48.     tb->addAction(item33);
  49.     tb->addAction(item34);
  50.     tb->addAction(item35);
  51.     tb->addAction(widgetAction);
  52.     tb->addAction(lineEditAction);
  53.     QVBoxLayout* mainLayout = new QVBoxLayout;
  54.     QHBoxLayout* topLayout = new QHBoxLayout;
  55.     topLayout->addLayout(l1);
  56.     topLayout->addLayout(l2);
  57.     topLayout->addLayout(l3);
  58.     QHBoxLayout* bottomLayout = new QHBoxLayout;
  59.     bottomLayout->addWidget(new QPushButton);
  60.     mainLayout->addLayout(topLayout);
  61.     mainLayout->addLayout(bottomLayout);
  62.     w->setLayout(mainLayout);
  63.     w->show();
  64. }


 
 
QMyWidgetAction.h :
 
 

Code :
  1. #ifndef QMAYAWIDGETACTION_H
  2. #define QMAYAWIDGETACTION_H
  3. #include <QObject>
  4. #include <QWidget>
  5. #include <QWidgetAction>
  6. class QLineEdit;
  7. class QMyWidgetAction : public QWidgetAction
  8. {
  9.     Q_OBJECT
  10. public:
  11.     QMyWidgetAction(QWidget* parent);
  12.     QWidget* createWidget(QWidget* parent);
  13. };
  14. class QLineEditAction : public QWidgetAction
  15. {
  16.     Q_OBJECT
  17. public:
  18.     QLineEditAction(QWidget* parent);
  19.     QWidget* createWidget(QWidget* parent);
  20. protected slots:
  21.     virtual void searchTextChanged(const QString& text);
  22. private:
  23.      QLineEdit* fWidget;
  24. };
  25. #endif // QMAYAWIDGETACTION_H


 
 
QMyWidgetAction.cpp :  
 

Code :
  1. #include <QApplication>
  2. #include <QtGui/QWindow>
  3. #include <QToolbar>
  4. #include <QVBoxLayout>
  5. #include <QMainWindow>
  6. #include <QPushButton>
  7. #include <QAction>
  8. #include <QIcon>
  9. #include <QLineEdit>
  10. #include <QSlider>
  11. #include <QVariant>
  12. #include <QCheckBox>
  13. #include <QWidgetAction>
  14. #include "QMyWidgetAction.h"
  15. QMyWidgetAction::QMyWidgetAction(QWidget* parent)
  16.     : QWidgetAction(parent)
  17. {
  18. }
  19. QWidget* QMyWidgetAction::createWidget(QWidget* parent)
  20. {
  21.     QPushButton* widget = new QPushButton("bouton", parent);
  22.     widget->setMinimumSize(100, 30);
  23.     return widget;
  24. }
  25. QLineEditAction::QLineEditAction(QWidget* parent)
  26.     : QWidgetAction(parent)
  27. {
  28. }
  29. QWidget* QLineEditAction::createWidget(QWidget* parent)
  30. {
  31.     fWidget = new QLineEdit(parent);
  32.     connect(fWidget, SIGNAL(textChanged(QString)), this, SLOT(searchTextChanged(QString)));
  33.     fWidget->setMinimumSize(100, 30);
  34.     return fWidget;
  35. }
  36. void QLineEditAction::searchTextChanged(const QString& text)
  37. {
  38.     fWidget->setMinimumWidth(fWidget->minimumWidth() + 10);
  39. }


 
 
Voici le resultat :  
 
http://img11.hostingpics.net/pics/504163tb3.jpg
 
Les widgets presents dans l'extension list fonctionnent correctement, je les ai testes. Mais maintenant je voudrais savoir si il est possible de les presenter horizontalement plutot que verticalement a l'interieur de l'extenion list ? Par exemple au lieu d'avoir "paste" en dessous de "open" je voudrais l'avoir a sa droite, et ainsi de suite. Merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed