Seite 1 von 1

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

Verfasst: 12. November 2006 01:48
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

Verfasst: 12. November 2006 08:16
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()));

Verfasst: 12. November 2006 13:27
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?

Verfasst: 12. November 2006 13:42
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...

Verfasst: 13. November 2006 00:07
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...

Verfasst: 13. November 2006 06:59
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. :)

Verfasst: 13. November 2006 20:38
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?

Verfasst: 14. November 2006 07:13
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.

Verfasst: 15. November 2006 12:47
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

Verfasst: 15. November 2006 12:55
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)));

Verfasst: 15. November 2006 21:17
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?

Verfasst: 16. November 2006 12:20
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);
}

Verfasst: 18. November 2006 15:26
von defenderLQ
also klappt nicht egal was ich mache..