[nicht gelöst]button das die toolbar dialog auch anzeigt

Alles rund um die Programmierung mit Qt
Antworten
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

[nicht gelöst]button das die toolbar dialog auch anzeigt

Beitrag von defenderLQ »

hi

nun habe ich mal ein button in meine neue toolbox reingepackt und wollte eine funktion vergeben das eben das eine toolbar dialog anzeigt wenn ich drauf klicke.
wie beim beim toolbar klick nur das der button es auch anzeigt.

also diese funktion muss etwas anders aussehen denke ich damit es eins
von den toolbar dialog aktiviert .

Code: Alles auswählen

  connect(ui.transfersButton, SIGNAL(clicked()),
      this, SLOT(4()));

mein mainwindow.cpp:

Code: Alles auswählen

#include <QtGui>
#include <QMessageBox>
#include <QSystemTrayIcon>
#include <QString>
#include <QtDebug>
#include <QIcon>
#include <QPixmap>

#include "swaste.h"
#include "MainWindow.h"
#include "Preferences/PreferencesWindow.h"
#include "config/gconfig.h"

#define FONT        QFont(tr("Arial"), 8)

/* Images for toolbar icons */
#define IMAGE_NETWORK           ":/images/network-transmit-receive.svg"
#define IMAGE_SEARCH    		":/images/system-search.svg"
#define IMAGE_TRANSFERS      	":/images/system-software-update.svg"
#define IMAGE_SHARED_FILES   	":/images/folder-remote.svg"
#define IMAGE_PREFERENCES       ":/images/applications-system.svg"
#define IMAGE_CHAT          	":/images/system-users.svg"
#define IMAGE_SWASTE          	":/images/swaste16.png"
#define IMAGE_CHATS          	":/images/internet-group-chat.svg"



/** Constructor */
MainWindow::MainWindow(QWidget* parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
  /* Invoke the Qt Designer generated QObject setup routine */
  ui.setupUi(this);
  
  GConfig config;
  config.loadWidgetInformation(this);


  /* Create the config pages and actions */
  QActionGroup *grp = new QActionGroup(this);
  ui.stackPages->add(new ConnectionsDialog(ui.stackPages),
                     createPageAction(QIcon(IMAGE_NETWORK), tr("Network"), grp));
  
  ui.stackPages->add(new ChatDialog(ui.stackPages),
                     createPageAction(QIcon(IMAGE_CHAT), tr("Users"), grp));
  
  ui.stackPages->add(new PeersDialog(ui.stackPages),
                     createPageAction(QIcon(IMAGE_CHATS), tr("Chats"), grp));
                                        
  ui.stackPages->add(new SearchDialog(ui.stackPages),
                     createPageAction(QIcon(IMAGE_SEARCH), tr("Search"), grp));
                     
  ui.stackPages->add(new TransfersDialog(ui.stackPages),
                     createPageAction(QIcon(IMAGE_TRANSFERS), tr("Transfers"), grp));
                     
  ui.stackPages->add(new SharedFilesDialog(ui.stackPages),
                     createPageAction(QIcon(IMAGE_SHARED_FILES), tr("Shared Files"), grp));
                                                                                 
                     
  //ui.stackPages->add(new StatisticDialog(ui.stackPages),
  //                   createPageAction(QIcon(IMAGE_STATISTIC), tr("Statistics"), grp));
  
  /* Create the toolbar */
  ui.toolBar->addActions(grp->actions());
  ui.toolBar->addSeparator();
  connect(grp, SIGNAL(triggered(QAction *)), ui.stackPages, SLOT(showPage(QAction *)));
 
  /* Create and bind the Preferences button */  
  addAction(new QAction(QIcon(IMAGE_PREFERENCES), tr("Preferences"), ui.toolBar),
            SLOT(showPreferencesWindow())); 
            
 

  /* Select the first action */
  grp->actions()[0]->setChecked(true);
  
  /* Create the actions that will go in the tray menu */
  createActions();

/** Creates a new action associated with a config page. */
QAction*
MainWindow::createPageAction(QIcon img, QString text, QActionGroup *group)
{
  QAction *action = new QAction(img, text, group);
  action->setCheckable(true);
  action->setFont(FONT);
  return action;
}

/** Adds the given action to the toolbar and hooks its triggered() signal to
 * the specified slot (if given). */
void
MainWindow::addAction(QAction *action, const char *slot)
{
  action->setFont(FONT);
  ui.toolBar->addAction(action);
  connect(action, SIGNAL(triggered()), this, slot);
}

/** Overloads the default show so we can load settings */
void
MainWindow::show()
{
  
  if (!this->isVisible()) {
    QMainWindow::show();
  } else {
    QMainWindow::activateWindow();
    setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
    QMainWindow::raise();
  }
}


/** Shows the config dialog with focus set to the given page. */
void
MainWindow::show(Page page)
{
  /* Show the dialog. */
  show();

  /* Set the focus to the specified page. */
  ui.stackPages->setCurrentIndex((int)page);
}



/** Shows Preferences */
void MainWindow::showPreferencesWindow()
{
    static PreferencesWindow* preferencesWindow = new PreferencesWindow(this);
    preferencesWindow->show();
}



/** Destructor. */
MainWindow::~MainWindow()
{


}

/** Create and bind actions to events. Setup for initial
 * tray menu configuration. */
void 
MainWindow::createActions()
{

  prefsAct = new QAction(QIcon(IMAGE_PREFERENCES), tr("Preferences"), this);
  connect(prefsAct, SIGNAL(triggered()), this, SLOT(showPreferencesWindow()));
  
  connect(ui.transfersButton, SIGNAL(clicked()),
      this, SLOT(showtransfers()));
  
}
und mein .h:

Code: Alles auswählen

#ifndef _MainWindow_H
#define _MainWindow_H

#include <QMainWindow>
#include <QFileDialog>
#include <QSystemTrayIcon>


#include "ConnectionsDialog.h"
#include "PeersDialog.h"
#include "SearchDialog.h"
#include "TransfersDialog.h"
#include "ChatDialog.h"
#include "SharedFilesDialog.h"
#include "StatisticDialog.h"

#include "Preferences/PreferencesWindow.h"


#include "ui_MainWindow.h"




class MainWindow : public QMainWindow
{
  Q_OBJECT

public:
   /** Main dialog pages. */
  enum Page {
    Network            = 0,  /** Connections page. */
    Users              = 1,  /** Users page. */
    SharedDirectories  = 2,  /** Shared Directories page. */
    Search 		       = 3,  /** Search page. */
    Transfers          = 4,  /** Transfers page. */
    Statistics         = 5  /** Statistic page. */
  };

  /** Default Constructor */
  MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
  
    /** Destructor. */
  ~MainWindow();

public slots:
  /** Called when this dialog is to be displayed */
  void show();
  /** Shows the config dialog with focus set to the given page. */
  void show(Page page);
  
  /** Called when the user exits Rshare. */
//  void close();
  

private slots:

    void updateMenu();
    void toggleVisibility();
    void showMessage();
    void balloonClicked();
    void activated(QSystemTrayIcon::ActivationReason);
    void changeIcon(int);
   
    void showPreferencesWindow();
 


protected:
    void closeEvent(QCloseEvent *);



private:
    /** Loads the current configuration settings */
  //void loadSettings();

  /** Create the actions on the tray menu or menubar */
  void createActions();

  
  PreferencesWindow* _preferencesWindow;
  

  /** Defines the actions for the tray menu */
  QAction* prefsAct;

  


  /** Creates a new action for a config page. */
  QAction* createPageAction(QIcon img, QString text, QActionGroup *group);
  /** Adds a new action to the toolbar. */
  void addAction(QAction *action, const char *slot = 0);
  
    QLineEdit *titleEdit;
    QTextEdit *msgEdit;
    QComboBox *typeCombo;
    QSystemTrayIcon *trayIcon;
    QAction *toggleVisibilityAction;
    QMenu *menu;
    QTextEdit *info;
    QComboBox *iconPicker;
  


  /** Qt Designer generated object */
  Ui::MainWindow ui;
};

#endif
Zuletzt geändert von defenderLQ am 21. November 2006 13:36, insgesamt 1-mal geändert.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Erklär uns doch mal welchen Sinn der folgende Code ergeben soll:

Code: Alles auswählen

connect(ui.transfersButton, SIGNAL(clicked()), this, SLOT(4()));
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

upsala hat geschrieben:Erklär uns doch mal welchen Sinn der folgende Code ergeben soll:

Code: Alles auswählen

connect(ui.transfersButton, SIGNAL(clicked()), this, SLOT(4()));
ich hatte vielleicht gedacht es ruft die StackedPage seite auf.

Code: Alles auswählen

Transfers          = 4,  /** Transfers page. */ 
ich denke ich muss kein neues void machen oder
für das Button?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

defenderLQ hat geschrieben: ich hatte vielleicht gedacht es ruft die StackedPage seite auf.

Code: Alles auswählen

Transfers          = 4,  /** Transfers page. */ 
Lerne bitte wie Signals & Slots funktionieren! Das Qt-Tutorial sollte dazu genügen...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

hi

also ich weis schon auswendig wie ich ein
ein POP UP Dialog ausführen kann ist ziemlich einfach.



wenn man was noch nie gemacht , also das erste mal
was machen muss was man nicht weis ist etwas schwierig.

ich schaue mir sehr oft examples an...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

defenderLQ hat geschrieben: ich schaue mir sehr oft examples an...
Dann hättest Du aber auch merken müssen dass dein connect() totaler Blödsinn ist. :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

hi

also so kann ich die preferences ausführen in einem Toolbar (pop up Dialog):

Code: Alles auswählen

     /* Create and bind the Preferences button */  
  addAction(new QAction(QIcon(IMAGE_PREFERENCES), tr("Options"), ui.toolBar),
            SLOT(showSettings())); 
mit einem Button ein pop up dialog ausführen:

Code: Alles auswählen

  /* Bind event to actions */
  connect( ui.settingsButton, SIGNAL(clicked()), this, SLOT(showSettings()));
nun ist die frage wie bekomme ich raus wie man ein stackedwidget
dialog mit einem pushbutton ausführen kann?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Erstelle einen Slot der die entsprechende Seite deines StackWidget anzeigt. Wenn Du mehrere Buttons hast, die unterschiedliche Seiten des StackWidgets anzeigen sollen, dann nehme einen SignalMapper, der die Clicked-Signale der Buttons mit den entsprechenden Integern verbindet, die für die Slots des StackWidget benötigt werden.
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

nun die hilfe bringt mich etwas weiter:

Code: Alles auswählen

                   
  ui.stackPages->add(new SharedFilesDialog(ui.stackPages),
                     createPageAction(QIcon(IMAGE_SHARED_FILES), tr("Shared Files"), grp));
                                                                                 
                     
  //ui.stackPages->add(new StatisticDialog(ui.stackPages),
  //                   createPageAction(QIcon(IMAGE_STATISTIC), tr("Statistics"), grp));
   
   
    signalMapper = new QSignalMapper(this);

    connect(ui.networkButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
   
    signalMapper->setMapping(ui.networkButton, 0);
    
    connect(signalMapper, SIGNAL(mapped(int)),
             stackedWidget, SIGNAL(setCurrentIndex(int)));
  
  /* Create the toolbar */
  ui.toolBar->addActions(grp->actions());
  ui.toolBar->addSeparator();
  connect(grp, SIGNAL(triggered(QAction *)), ui.stackPages, SLOT(showPage(QAction *)));
mainwindow.h:

Code: Alles auswählen

private:
    /** Loads the current configuration settings */
  //void loadSettings();

  /** Create the actions on the tray menu or menubar */
  void createActions();

  
  PreferencesWindow* _preferencesWindow;
  
  QSignalMapper* signalMapper;
  

  /** Defines the actions for the tray menu */
  QAction* prefsAct;
es kommt ein Fehler:
./gui/MainWindow.h:106: error: ISO C++ forbids declaration of `QSignalMapper' wi
th no type
./gui/MainWindow.h:106: error: expected `;' before '*' token
ich habe ja den signalMapper deklariert wie beim beispiel:
http://doc.trolltech.com/4.2/qsignalmapper.html
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

Ich habe die #include QSignalMapper vergessen gehabt.
nun kann ich es ohne probleme kompilieren aber
der button zeigt die gewünschte seite nicht an.

Code: Alles auswählen

 signalMapper = new QSignalMapper(this);

    connect(ui.networkButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
   
    signalMapper->setMapping(ui.networkButton, 0);
    
    connect(signalMapper, SIGNAL(mapped(int)),
             ui.stackPages, SIGNAL(setCurrentIndex(int)));
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

also nun habe ich das ganz in meinem settings testen wollen ob es da klappt.
weil ja die settings normale stacketWidget hat,
und die settings noch nicht ausgebaut ist wollte ich mal testen ob der Cancel button ein stacketWidget dialog anzeigt.

Habe dem Cancel Button ein function gegeben:

Code: Alles auswählen

#include "GeneralPage.h"
#include "DirectoriesPage.h"
#include "ServerPage.h"
#include "NetworkPage.h"
#include "gsettingswin.h"
#include "config/gconfig.h"

#include <QSignalMapper>

GSettingsWin::GSettingsWin(QWidget * parent, Qt::WFlags flags)
                            : QDialog(parent, flags)
{
    ui.setupUi(this);
    setAttribute(Qt::WA_QuitOnClose, false);
    setModal(false);
    //setWindowTitle(windowTitle() + QLatin1String(___SWASTE_WINTITLE));

    initStackedWidget();
    
    signalMapper = new QSignalMapper(this); 
    
    connect(ui.cancelButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
    
    signalMapper->setMapping(ui.cancelButton, 0);
    
    connect(signalMapper, SIGNAL(mapped(int)),
             stackedWidget, SIGNAL(setCurrentIndex(int)));


    connect(listWidget, SIGNAL(currentRowChanged(int)),
            this, SLOT(setNewPage(int)));

    GConfig config;
    config.loadWidgetInformation(this);
    
    setFixedSize(QSize(542, 413));
}

void
GSettingsWin::closeEvent (QCloseEvent * event)
{
    GConfig config;
    config.saveWidgetInformation(this);

    QWidget::closeEvent(event);
}

void
GSettingsWin::initStackedWidget()
{
    stackedWidget->setCurrentIndex(-1);
    stackedWidget->removeWidget(stackedWidget->widget(0));

    stackedWidget->addWidget(new GeneralPage(false));    
    stackedWidget->addWidget(new NetworkPage());
    stackedWidget->addWidget(new ServerPage());
    stackedWidget->addWidget(new DirectoriesPage());
   

    setNewPage(General);
    
    
}

void
GSettingsWin::setNewPage(int page)
{
    QString text;

    if (page == General)
        text = tr("General");
    else if (page == Network)
        text = tr("Network");
    else if (page == Directories)
        text = tr("Directories");
    else if (page == Server)
        text = tr("Server");

    pageName->setText(tr("%1").arg(text));
    stackedWidget->setCurrentIndex(page);
    listWidget->setCurrentRow(page);
}

Code: Alles auswählen

#ifndef GSETTINGSWIN_HPP_
# define GSETTINGSWIN_HPP_

# include <QtGui/QDialog>
#include <QSignalMapper>
# include "ui_settings.h"


class GSettingsWin: public QDialog, private Ui::settings
{
    Q_OBJECT

    public:
        enum PageType { General = 0, Network, Server, Directories  };

        GSettingsWin(QWidget * parent = 0, Qt::WFlags flags = 0);
        ~GSettingsWin() {}

    public slots:
        //! Go to a specific part of the control panel.
        void setNewPage(int page);

    private:
        void closeEvent (QCloseEvent * event);
        void initStackedWidget();
        
        QSignalMapper* signalMapper; 
        
         Ui::settings ui;
};

#endif // !GSETTINGSWIN_HPP_
stürtz mein anwendung ab wenn ich die Optionen ausführe..

habe ich was falsch gemacht mit der ui.cancelButton?
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

also ich hab nun das .ui problem gelöst und es kommt kein absturz.
aber der button kann die gewünschten dialog nicht anzeigen:


Code: Alles auswählen

#include "GeneralPage.h"
#include "DirectoriesPage.h"
#include "ServerPage.h"
#include "NetworkPage.h"
#include "gsettingswin.h"
#include "config/gconfig.h"

#include <QSignalMapper>

GSettingsWin::GSettingsWin(QWidget * parent, Qt::WFlags flags)
                            : QDialog(parent, flags)
{
    setupUi(this);
    setAttribute(Qt::WA_QuitOnClose, false);
    setModal(false);
    //setWindowTitle(windowTitle() + QLatin1String(___SWASTE_WINTITLE));

    initStackedWidget();
    
    signalMapper = new QSignalMapper(this); 
    
    connect(cancelButton, SIGNAL(clicked()), signalMapper, SLOT(map()));
    
    signalMapper->setMapping(cancelButton, 0);
    
    connect(signalMapper, SIGNAL(mapped(int)),
             stackedWidget, SIGNAL(setCurrentIndex(int)));


    connect(listWidget, SIGNAL(currentRowChanged(int)),
            this, SLOT(setNewPage(int)));

    GConfig config;
    config.loadWidgetInformation(this);
    
    setFixedSize(QSize(542, 413));
}

void
GSettingsWin::closeEvent (QCloseEvent * event)
{
    GConfig config;
    config.saveWidgetInformation(this);

    QWidget::closeEvent(event);
}

void
GSettingsWin::initStackedWidget()
{
    stackedWidget->setCurrentIndex(-1);
    stackedWidget->removeWidget(stackedWidget->widget(0));

    stackedWidget->addWidget(new GeneralPage(false));    
    stackedWidget->addWidget(new NetworkPage());
    stackedWidget->addWidget(new ServerPage());
    stackedWidget->addWidget(new DirectoriesPage());
   

    setNewPage(General);
    
    
}

void
GSettingsWin::setNewPage(int page)
{
    QString text;

    if (page == General)
        text = tr("General");
    else if (page == Network)
        text = tr("Network");
    else if (page == Directories)
        text = tr("Directories");
    else if (page == Server)
        text = tr("Server");

    pageName->setText(tr("%1").arg(text));
    stackedWidget->setCurrentIndex(page);
    listWidget->setCurrentRow(page);
}
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

also klappt nicht egal was ich mache..
Antworten