Viele Kleine Probleme...[gelöst]

Verschiedenes zu Qt
Antworten
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Viele Kleine Probleme...[gelöst]

Beitrag von Qt-nator »

Hi,

ich hätte da ein paar Probleme bei denen ich gut Hilfe gebrauchen könnte.

Zum einen wäre da:

Ich habe ein Widget in dem wenn ich die Maus bewege die Position der Maus in einen QString gespeichert wird und per signal an mein MainWindo übergeben und in die Statusbar geschrieben wird.

Problem ich muss wissen aus welchem Widget es kommt da ich 4 habe diese aber die selbe Klasse besitzen.

Code: Alles auswählen


  connect (m_pParameterToolWidget->m_pPlot1, SIGNAL(signalMousePosition(const QString&)), statusBar(), SLOT( showMessage(const QString&))); 

  connect (m_pParameterToolWidget->m_pPlot2, SIGNAL(signalMousePosition(const QString&)), statusBar(), SLOT( showMessage(const QString&))); 

Meine Idee ist jetzt an den QString einfach was dranzuhängen beim connect oder geht das nicht??? Sowas wie + "Plot1" oder so in der Art.

Dann müsste ich wissen ob man wie bei QPolygon so eine .containsPoint abfrage machen kann oder was in der Art.

Code: Alles auswählen


void
ParameterToolPlot::mouseDoubleClickEvent(QMouseEvent* event)
{
  QString sMouseInteraction = "Maustaste wurde doppelt geklickt.";

  emit signalMousePosition(sMouseInteraction);

  for (int i=0; i<m_vPolygons.size(); i++)
  {
    if(m_vPolygons.at(i).containsPoint( event->pos(),Qt::OddEvenFill))
    {
      m_vbBoolean.at(i) = !m_vbBoolean.at(i);
      
      QMessageBox::information( this, "Info", "IST IN "+ QString::number(i+1) +" DRIN");

      break;
    }
  }
}

Da bräuchte ich noch eine abfrage in welchem Widget es ist um es in der Msg Box hinzuzufügen.

Und dann hab ich noch ein Problem mit der Ansicht der 4 verschiedenen Widgets.

In meinem MainWindow habe ich ein TextEdit in dem ich was reinschreibe und dann auf einen Button drücke um das Paintevent anzuschmeißen.

Ich möchte jetzt mit verschiedenen Schlüsselwörtern alle 4 anzeigen lassen 1 der 4 groß oder alle nicht anzeigen lassen.

Code: Alles auswählen


  if  (sDrawContents.contains("Quad", Qt::CaseInsensitive))
  {
    bDrawLine = true;

    m_pPlot1->setGeometry(0,0,width()/2. - 1,height()/2.);

    m_pPlot1->show();

    m_pPlot2->setGeometry(width()/2. + 1,0,width()/2., height()/2.);

    m_pPlot2->show();

    m_pPlot3->setGeometry(0,height()/2. + 1,width()/2.  -1 , height()/2.);

    m_pPlot3->show();

    m_pPlot4->setGeometry(width()/2. + 1,height()/2. + 1,width()/2.,height()/2.);

    m_pPlot4->show();
  }
  else
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }

Das funktioniert gut nur, wenn ich dann

Code: Alles auswählen


if  (sDrawContents.contains("Singel1", Qt::CaseInsensitive))
  {

    bDrawLine = false;
    
    m_pPlot2->setGeometry(0,0,width(),height());

    m_pPlot2->hide();
    
    m_pPlot3->setGeometry(0,0,width(),height());

    m_pPlot3->hide();

    m_pPlot4->setGeometry(0,0,width(),height());

    m_pPlot4->hide();

    m_pPlot1->setGeometry(0,0,width(),height());

    m_pPlot1->show();
  }
}

benutze und dann versuche es wieder auf Quad zu setzen bleibt es bei Singel1 stehn. Also weckselt nicht mehr.

Woran könnte das liegen???

also ich wäre für Hilfe und Lösungsansetze sehr dankbar.

Gruß

Qt-nator
Zuletzt geändert von Qt-nator am 28. März 2008 09:51, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Viele Kleine Probleme...

Beitrag von franzf »

Qt-nator hat geschrieben:Problem ich muss wissen aus welchem Widget es kommt da ich 4 habe diese aber die selbe Klasse besitzen.
objectName
Dann müsste ich wissen ob man wie bei QPolygon so eine .containsPoint abfrage machen kann oder was in der Art.

Code: Alles auswählen


void
ParameterToolPlot::mouseDoubleClickEvent(QMouseEvent* event)
{
  QString sMouseInteraction = "Maustaste wurde doppelt geklickt.";

  emit signalMousePosition(sMouseInteraction);

  for (int i=0; i<m_vPolygons.size(); i++)
  {
    if(m_vPolygons.at(i).containsPoint( event->pos(),Qt::OddEvenFill))
    {
      m_vbBoolean.at(i) = !m_vbBoolean.at(i);
      
      QMessageBox::information( this, "Info", "IST IN "+ QString::number(i+1) +" DRIN");

      break;
    }
  }
}

Da bräuchte ich noch eine abfrage in welchem Widget es ist um es in der Msg Box hinzuzufügen.
Weiß ich grad nicht wo dein Problem liegt...
Und dann hab ich noch ein Problem mit der Ansicht der 4 verschiedenen Widgets.

In meinem MainWindow habe ich ein TextEdit in dem ich was reinschreibe und dann auf einen Button drücke um das Paintevent anzuschmeißen.

Ich möchte jetzt mit verschiedenen Schlüsselwörtern alle 4 anzeigen lassen 1 der 4 groß oder alle nicht anzeigen lassen.

Das funktioniert gut nur, wenn ich dann

benutze und dann versuche es wieder auf Quad zu setzen bleibt es bei Singel1 stehn. Also weckselt nicht mehr.

Woran könnte das liegen???
Ist bissl wenig code um zu sehen wo es hängt.
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

hab ich das richtig verstanden das es so gehn müsste?

Code: Alles auswählen


void
ParameterToolPlot::mouseDoubleClickEvent(QMouseEvent* event)
{
  QString sMouseInteraction = "Maustaste wurde doppelt geklickt.";

  emit signalMousePosition(sMouseInteraction);

  for (int i=0; i<m_vPolygons.size(); i++)
  {
    if(m_vPolygons.at(i).containsPoint( event->pos(),Qt::OddEvenFill))
    {
      m_vbBoolean.at(i) = !m_vbBoolean.at(i);
      
      QString Object = QObject::objectName();

      QMessageBox::information( this, "Info", "IST IN "+ QString::number(i+1) +" DRIN in" + Object);
      
       break;
    }
  }
}

weil so gehts nicht... krieg ich komische werte in Object. Ansonsten bitte um Verbesserung.


constructor

Code: Alles auswählen


ParameterToolWidget::ParameterToolWidget(QWidget *parent): QWidget(parent)
{
  setBackgroundRole(QPalette::Base);

  setAutoFillBackground(true);

  m_pPlot1 = createWidgets(0,0,width()/2. - 1,height()/2.,1 );

  m_pPlot2 = createWidgets(width()/2. + 1,0,width()/2., height()/2.,2);

  m_pPlot3 = createWidgets(0,height()/2. + 1,width()/2.  -1 , height()/2.,3);

  m_pPlot4 = createWidgets(width()/2. + 1,height()/2. + 1,width()/2.,height()/2.,4);

  m_pPlot1->setMouseTracking(true);

  m_pPlot2->setMouseTracking(true);

  m_pPlot3->setMouseTracking(true);

  m_pPlot4->setMouseTracking(true);
}

und im paint event

Code: Alles auswählen


  if  (sDrawContents.contains("Quad", Qt::CaseInsensitive))
  {
  
    painter.drawLine(0,height()/2.,dWidth,height()/2.);

    painter.drawLine(width()/2.,0,width()/2.,dHeight);

    m_pPlot1->setGeometry(0,0,width()/2. - 1,height()/2.);

    m_pPlot1->show();

    m_pPlot2->setGeometry(width()/2. + 1,0,width()/2., height()/2.);

    m_pPlot2->show();

    m_pPlot3->setGeometry(0,height()/2. + 1,width()/2.  -1 , height()/2.);

    m_pPlot3->show();

    m_pPlot4->setGeometry(width()/2. + 1,height()/2. + 1,width()/2.,height()/2.);

    m_pPlot4->show();
  }
  else
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }

  if  (sDrawContents.contains("Hide", Qt::CaseInsensitive))
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }

  if  (sDrawContents.contains("Singel1", Qt::CaseInsensitive))
  {
    m_pPlot1->show();
  
    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }

  if  (sDrawContents.contains("Singel2", Qt::CaseInsensitive))
  {
    m_pPlot1->hide();

    m_pPlot2->show();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }  

  if  (sDrawContents.contains("Singel3", Qt::CaseInsensitive))
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot3->show();

    m_pPlot4->hide();
  }  

  if  (sDrawContents.contains("Singel4", Qt::CaseInsensitive))
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->show();
  } 


header

Code: Alles auswählen


public:
 
  ParameterToolPlot *m_pPlot1;

  ParameterToolPlot *m_pPlot2;

  ParameterToolPlot *m_pPlot3;

  ParameterToolPlot *m_pPlot4;


Aber wenn ich dann bei einen der SingelX setGeometry mache dann setzt ers einmal groß und wenn ich dann z.B. wieder Quad mache gehts nicht mehr zurück.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Qt-nator hat geschrieben:hab ich das richtig verstanden das es so gehn müsste?[...]
So war es nicht gemeint ;)
Du gibst jedem deiner 4 Widgets mit setObjectName einen eindeutigen (!) Namen. In deinem Slot des MainWindow kannst du dann mittels

Code: Alles auswählen

QString name;
QObject *sender = sender();
if (sender)
    name = sender->objectName();
Den Namen wieder abfragen und weißt was zu tun ist.

Zu dem Größenproblem:
Du weißt, dass du auch ein "else if" hast? Denn jedes dieser "if"s wird bei jedem Durchlauf abgefragt.
Ansonsten sind die Teile des "Singel1" ind den beiden Postings verschieden (einmal mit setGeometry, beim letzten ohne).
Zuletzt geändert von franzf am 27. März 2008 12:00, insgesamt 1-mal geändert.
Deever
Beiträge: 90
Registriert: 9. Mai 2007 18:20

Beitrag von Deever »

[OT]
Sag mal, Qt-nator, arbeitest du für irgendnen Maushersteller? Nur so, weil du deine Posts mit Leerzeilen künstlich verlängerst und man immer scrollen muß! SCNR ;)
[/OT]
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Sicher arbeite ich für einen Maushersteller... Ich finde es einfach übersichtlicher so.


Du gibst jedem deiner 4 Widgets mit setObjectName einen eindeutigen (!) Namen. In deinem Slot des MainWindow kannst du dann mittels

ist mir noch nicht ganz klar...

also ich hab das jetzt so gemacht (wegen der Größe)

Code: Alles auswählen


if  (sDrawContents.contains("Quad", Qt::CaseInsensitive))
  {
  
    painter.drawLine(0,height()/2.,dWidth,height()/2.);

    painter.drawLine(width()/2.,0,width()/2.,dHeight);

    m_pPlot1->setGeometry(0,0,width()/2. - 1,height()/2.);

    m_pPlot1->show();

    m_pPlot2->setGeometry(width()/2. + 1,0,width()/2., height()/2.);

    m_pPlot2->show();

    m_pPlot3->setGeometry(0,height()/2. + 1,width()/2.  -1 , height()/2.);

    m_pPlot3->show();

    m_pPlot4->setGeometry(width()/2. + 1,height()/2. + 1,width()/2.,height()/2.);

    m_pPlot4->show();
  }
  else
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }

  if  (sDrawContents.contains("Singel1", Qt::CaseInsensitive))
  {
    m_pPlot1->setGeometry(0,0,width(),height());

    m_pPlot1->show();
  
    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }
  else if  (sDrawContents.contains("Singel2", Qt::CaseInsensitive))
  {
    m_pPlot1->hide();

    m_pPlot2->setGeometry(0,0,width(),height());

    m_pPlot2->show();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }  

  else if  (sDrawContents.contains("Singel3", Qt::CaseInsensitive))
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot4->setGeometry(0,0,width(),height());

    m_pPlot3->show();

    m_pPlot4->hide();
  }  

  else if  (sDrawContents.contains("Singel4", Qt::CaseInsensitive))
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->setGeometry(0,0,width(),height());

    m_pPlot4->show();
  }  
  else
  {
    m_pPlot1->hide();

    m_pPlot2->hide();

    m_pPlot3->hide();

    m_pPlot4->hide();
  }


Und es ist das selbe Problem...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn du 4 gleiche Widgets hast und davon immer nur 1 Sichtbar sein soll, würde ich mir mal QStackedWidget ansehen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich hab dir jetzt mal schnell was gebastelt, mit GridLayout.
Kann man alles sicher schöner machen, aber es klappt, und du musst dir keine Sorgen machen, ob die Geometry richtig ist...
Dateianhänge
grid_layout.zip
Beispiel
(2.12 KiB) 180-mal heruntergeladen
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Ein paar Tipps...

Beitrag von neuschi »

Hallo Qt-nator...

meinst du nicht, dass dein Name ein wenig hoch gegriffen ist?! :)

Ich hacke hier mal ein paar Zeilen runter (Pseudo-Qt, ungetestet), vielleicht kannst du daraus ein paar Lehren für dein Programm ziehen:

Code: Alles auswählen

#include <QtGui>
class MyWindow : public QWidget
{
Q_OBJECT
public:
    enum
    {
           ShowOne = 0x1,
           ShowTwo = 0x2,
           ShowThree = 0x4,
           ShowFour = 0x8
    } PlotFlag;

   Q_FLAGS(PlotFlags ,PlotFlag);

   MyWindow(...) : QWidget(...)
   {
        // Gui aufbauen
        m_plot1 = new PlotDingens(this);
        m_plot2 = new PlotDingens(this);
        m_plot3 = new PlotDingens(this);
        m_plot4 = new PlotDingens(this);
       
      m_buttonQuad = new QPushButton("Quad", this);
      m_buttonS1 = new QPushButton("Single ",this)
      m_buttonS2 = new QPushButton("Single2",this);
      m_buttonS3 = new QPushButton("Single3",this);
      m_buttonS4 = new QPushButton("Single4",this);;
      m_button13 = new QPushButton("S1and3");

      m_buttonS1->setProperty("plotFlags",  ShowOne);
      m_buttonS2->setProperty("plotFlags",  ShowTwo);
      m_buttonS3->setProperty("plotFlags",  ShowThree);
      m_buttonS4->setProperty("plotFlags",  ShowFour);
  
      m_buttonQuad->setProperty("plotFlags",  ShowOne|ShowTwo|ShowThree|ShowFour);
      m_button13->setProperty("plotFlags",  ShowOne|ShowThree);

    connect(m_buttonS1, SIGNAL(clicked()), this, SLOT(sl_togglePlotWindows()));
    connect(m_buttonS2, SIGNAL(clicked()), this, SLOT(sl_togglePlotWindows()));
    connect(m_buttonS3, SIGNAL(clicked()), this, SLOT(sl_togglePlotWindows()));
      .. usw. ...
}

void MyWindow::sl_togglePlotWindows()
{
     PlotFlags fl = (PlotFlags) sender()->property("plotFlags").toInt();

      m_plot1->setVisible( fl & ShowOne);
      m_plot2->setVisible( fl & ShowTwo);
      m_plot3->setVisible( fl & ShowThree);
      m_plot4->setVisible( fl & ShowFour);
}

Hier im Forum sind schon viele nützliche Hinweise für dich gekommen. Nimm die ernst, denk drüber nach und versuche die zu verstehen.
Und noch ein Hinweis: es ist wesentlich leichter sich über etwas zu unterhalten, wenn beide die gleiche Sprache sprechen. Streue bitte ab und zu ein paar Satzzeichen und Großbuchstaben ein, dann liest sich das alles viel besser.

\Ralf
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Qt-nator hat geschrieben:
Du gibst jedem deiner 4 Widgets mit setObjectName einen eindeutigen (!) Namen. In deinem Slot des MainWindow kannst du dann mittels
ist mir noch nicht ganz klar...
Du hast deine Widgets (ParameterToolPlot). Diese emitten ein Signal, wenn geclicked wurde. Im MainWindow willst du nun wissen, welches der Widgets das jetzt war (werden wahrscheinlich alle an den selben SLOT connected.
Nun kannst du im Mainwindow folgendes machen:

Code: Alles auswählen

MainWindow::MainWindow()
{
    m_square = new Square(this);
    m_square->setObjectName("Square");
    connect(m_square, SIGNAL(mouseClicked(QString)), this, SLOT(onToolPlotClicked(QString)));
    [...]
}

void MainWindow::onToolPlotClicked(QString)
{
    [...]
    QString senderName;
    QObject* sender = sender();  // siehe Doku QObject* QObject::sender()
    if (sender)  // wir wollen doch keinen SegFault auslösen
        senderName = sender->objectName();
    if (senderName == "Square")
        machWasMitSquare();
    [....]
}
Hoffe das war jetzt klarer :)
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Ich habs jetzt gelöst vielen dank auch.


Gruß Qt-nator
Antworten