QVBox oder QGroupBox

Alles rund um die Programmierung mit Qt
Antworten
timbuktubob
Beiträge: 11
Registriert: 11. August 2004 07:44
Wohnort: Bergen/Rügen
Kontaktdaten:

QVBox oder QGroupBox

Beitrag von timbuktubob »

Mein Problem! ich will wie auf dem Bild zu erkennen ist, dort wo die Pfeile hinzeigen will ich wenn ich mit der rechten Maustaste dort anklick das es gelöscht wird! aber nur dort! und nicht im Großenfeld! Muß ich mir jetzt eine eigene Klasse schreiben oder kann ich bereits vorhandenes Material verwenden!?

hier das Bild!
www.fotos.web.de/timbuktubob
war Fehler findet darf Sie behalten!
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

arbeitest Du mit QTabDialog, oder mit QTabBar?

Gruß

Mike
timbuktubob
Beiträge: 11
Registriert: 11. August 2004 07:44
Wohnort: Bergen/Rügen
Kontaktdaten:

Beitrag von timbuktubob »

mit QTabDialog! hast du eine lösung?
war Fehler findet darf Sie behalten!
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

hab leider auch keine Lösung, aber eine Idee, wie Du es mal versuchen könntest. Kann natürlich sein, dass es eine viel einfachere Methode gibt.

Dafür benötigst Du QTabDialog und QTabBar.

Zunächst erstellst Du eine neue Klasse, abgeleitet von QTabDialog, ich nenne sie mal einfach "MyTabDialog".

Dann erstellst Du eine Klasse, abgeleitet von QTabBar, im folgenden "MyTabBar" genannt.

Jetzt gehst Du folgendermaßen vor:

Im Konstruktor von MyTabDialog legst Du eine eigene QTabBar fest, dafür gibt es die Funktion setTabBar. Das ganze schaut dann in etwa so aus:

Code: Alles auswählen

class MyTabDialog : public QTabDialog {
  MyTabDialog(QWidget * parent, const char * name) : QTabDialog(parent, name) {

    //Hiermit wird die neue TabBar gesetzt  
    setTabBar(new MyTabBar(this, "MyTabBar"))

  }
}
MyTabBar muss natürlich vorher noch definiert werden. QTabBar gibt Dir die Möglichkeit herauszufinden, an welchem Punkt (Pixel) sich welcher Tab befindet. Du könntest nun folgendes versuchen:

Du fängst vom Fenster die MouseEvents ab. Klickt der User mit der rechten Maustaste wird ein Slot von MyTabBar aufgerufen, welches nun überprüft, welches Tab sich an den Koordinaten der Maus befindet. Dafür gibt es folgende Methode:

virtual QTab * selectTab ( const QPoint & p ) const

Diese gibt Dir einen Pointer auf das Tab zurück, an dem sich die Maus befindet. Falls sich die Maus über keinem Tab befindet, wird 0 zurückgegeben. So hast Du also die Möglichkeit herauszufinden, welches Tab der User mit der rechten Maustaste angeklickt hat.

Nun kannst Du mit der Methode

void QTabBar::removeTab ( QTab * t )

das Tab entfernen.


Ich hab wie gesagt absolut keine Ahnung, ob das funktioniert. Ich könnte mir jedoch vorstellen, dass es von den Ansätzen her funktioniert. Vielleicht hilft es Dir ja weiter.

Gruß

Mike
timbuktubob
Beiträge: 11
Registriert: 11. August 2004 07:44
Wohnort: Bergen/Rügen
Kontaktdaten:

Beitrag von timbuktubob »

also diese Sachen helfen mir nicht wirklich ein!
Du fängst vom Fenster die MouseEvents ab. Klickt der User mit der rechten Maustaste wird ein Slot von MyTabBar aufgerufen, welches nun überprüft, welches Tab sich an den Koordinaten der Maus befindet. Dafür gibt es folgende Methode:

virtual QTab * selectTab ( const QPoint & p ) const

Diese gibt Dir einen Pointer auf das Tab zurück, an dem sich die Maus befindet. Falls sich die Maus über keinem Tab befindet, wird 0 zurückgegeben. So hast Du also die Möglichkeit herauszufinden, welches Tab der User mit der rechten Maustaste angeklickt hat.
die methode die du hier drinne beschrieben hast, fängt die schon die ganzen mouseEvents ab oder wie? habe echt keinen schimmer wie ich das hinkriegen kann!
war Fehler findet darf Sie behalten!
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

oki ich hab Dir mal was gebastelt.

Code: Alles auswählen

/****** Datei MySlots.h (Name hat keine Bedeutung) ******/

#include <iostream>
#include <qlineedit.h>
#include <qtabbar.h>
#include <qtabdialog.h>
#include <qvbox.h>


class MyTabBar : public QTabBar {

  Q_OBJECT
  
  public:
    MyTabBar ( QWidget * parent, const char * name = 0 ) : QTabBar(parent, name) {

      
    }
    
    void mousePressEvent ( QMouseEvent *e ) {
      printf("%s wurde geklickt\n", name());
      
      if (e->button() == QWidget::RightButton) {
      
        QTab *selectedTab = selectTab(e->pos());
        removeTab(selectedTab);
      } else {
        QTabBar::mousePressEvent(e);
      }
    }

};

class MyTabDialog : public QTabDialog {
  Q_OBJECT
  
  public: 
    MyTabDialog( QWidget * parent, const char * name = 0 ) : QTabDialog(parent, name) {
      MyTabBar *myTabBar = new MyTabBar(this, "MyTabBar");
      
      setTabBar(myTabBar);
      
      
      int jahr = 2000;
    
      for (int i=0; i<12; i++) { 
        QVBox* myBox = new QVBox(this); 
        addTab( myBox, QString::number(jahr + i) ); 
      } 

    }
};

/****** Datei MySlots.h Ende ******/



/****** Datei main.cpp ******/

#include <qapplication.h>

#include "MySlots.h"

using namespace std;

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    MyTabDialog *myTabDialog = new MyTabDialog(0, "MyWindow");
    
    
    a.setMainWidget(myTabDialog);
    myTabDialog->show();
    return a.exec();
}

/****** Datei main.cpp Ende ******/

Ich erstelle also ein QTabDialog, übergebe meine eigene QTabBar, in der ich die MouseEvents abfrage. Wenn die rechte Maustaste geklickt wurde, frag ich ab, welches Tab sich unter diesen Koordinaten befunden hat. Und dieses wird dann entfernt.

Hoffe es hilft.

Gruß

Mike
jaegermeister
Beiträge: 70
Registriert: 11. August 2004 07:44
Wohnort: Bergen auf Rügen
Kontaktdaten:

Beitrag von jaegermeister »

Das sollte so funktionieren.

Frage @ mike
Wielange brauchst du so für so ein Stück Code?
Das ist gut um darauf zu kommen bräucht ich woll ne paar Stunden.
Und wie lange machst du schon QT?

Mfg jaegermeister
Wie könnten ja wenn wir wollten, aber wie wollen ja nicht.
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi Jaegermeister,

ich muss natürlich auch erst die Dokumentationen von Trolltech durchstöbern und eventuell Beispiele anschauen, wie sowas überhaupt geht, da ich weder QTab noch QTabDialog oder so je benutzt habe. Und dann fang ich anhand der Klassenübersicht und den Beschreibungen an zu basteln. Die obige Lösung hat also schon etwas Zeit in Anspruch genommen (also ca. eine halbe bis eine Stunde Dokus lesen, Beispiele anschauen, Google fragen und dann noch halbe Stunde tippen und rumprobieren).

Um genau zu sein, mach ich eigentlich noch nicht viel Qt. Ich habe vor 1-2 Jahren mal ein bis zwei Wochen damit rumgespielt, hab dann jedoch wieder aufgehört, da ich andere Dinge programmieren musste, die keine GUIs benötigt haben. Nun habe ich vor 2 Wochen wieder angefangen mir das ganze mal anzuschauen, da mich das Toolkit immer wieder interessiert und ich außerdem KDE-User bin. Nur hatte ich bis vor 2 Wochen mit Java zu kämpfen, weshalb ich von C++ die Finger gelassen habe. :)

Normal programmiere ich fast nie etwas mit GUIs, aber vielleicht braucht man es doch irgendwann mal und dann fände ich ein kleines Qt - oder KDE - Programm schon nett :) Leider bin ich bisher nicht über ein kleines Beispielprogramm hinausgekommen, um einen Einstieg zu finden und eben die Beispiele hier im Forum. Die Dokus von Trolltech sind jedoch sehr gut und durch das Lesen von Fragen und den passenden Antworten (oder selbst Antworten versuchen zu finden) lernt man immer etwas dazu.

Gruß

Mike
Antworten