Splitter an Mauspotition setzen

Alles rund um die Programmierung mit Qt
Antworten
AlexanderKiebler82
Beiträge: 20
Registriert: 4. Juni 2009 12:19
Kontaktdaten:

Splitter an Mauspotition setzen

Beitrag von AlexanderKiebler82 »

Hi,
Ich würde gene einen Splitter genau an der Postion setzen, an welcher ich geklickt habe. Dazu speichere ich die Mauskoordinaten nach dem klicken

Code: Alles auswählen

void BorderModellQT::contextMenuEvent(QContextMenuEvent *event)
{x=event->x();
        y=event->y()-this->geometry().y();
.....
Leider kann ich keine Funktion finden, welche einen Splitter an einer absoluten position setzt. Es sind immer nur die verhältnisse der fenster zueinander, nicht aber eine absolute Position.
Wollte fragen ob ich eine übersehen habe.
Gruß Alex
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag von The User »

Meinst du jetzt einen QSplitter oder was? Der hat natürlich QWidget::move.
AlexanderKiebler82
Beiträge: 20
Registriert: 4. Juni 2009 12:19
Kontaktdaten:

Splitter an Mauspotition setzen

Beitrag von AlexanderKiebler82 »

void QSplitter::moveSplitter ( int pos, int index ) [protected]
habe ich schon versucht. Aber Move macht auch nicht das was ich gerne hätte.
Es verschiebt den Spllitter relativ zum eingefügten Widget.
Wie es ausschaut muß ich nicht den Splitter verschieben, sonder die Widgetgrößen verändern. Kann das sein???
Gruß Alex
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QSplitter::setSizes().
Musst dir halt die korrekten sizes mit dem Klick ausrechnen.
AlexanderKiebler82
Beiträge: 20
Registriert: 4. Juni 2009 12:19
Kontaktdaten:

Beitrag von AlexanderKiebler82 »

Also wenn ich einen Splitter habe, in welchem sich drei widgets befinden.

Code: Alles auswählen

QList <int> list;
list=splitter->sizes();
for(int i=0;i<splitter->size();i++)
{
     if(!i)
          splitter[i]=2;
      else
          splitter[i]=1;
}
splitter->setSize(list);
Er macht mir hier alle splitter mit dem gleichen abstand voneinander. Ich hätte erwartet, dass der splitter.at(0) doppelt so viel fläche hat.
Gruß
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Dein Besipiel kompiliert nicht, außerdem kann es nicht funktionieren.

Code: Alles auswählen

QList <int> list; 
list=splitter->sizes(); 
for(int i=0;i<splitter->size();i++) 
{ 
     if(!i) 
          splitter[i]=2; 
      else 
          splitter[i]=1; 
} 
splitter->setSize(list);
Wenn du iterieren willst, dann über liet und nicht splitter.
splitter->setSizes() und nicht setSize().

Und das Prinzip hast du auch nicht so ganz verstanden.
Wenn dein Splitter vertical ist, enthält sizes die Höhen der Widgets, bei horizontalem Splitter halt die Breiten.
Und ebenso sollten diese Werte beim Setzen dem entsprechen, was du haben willst.
Soll sich der Splitter in seiner Größe nicht ändern, musst du halt bei den Größen anpassen. Machst du das eine Widget um 10px größer, musst du das andere halt um 10px kleiner machen.
Ein weiteres Problem kann sein, dass dir auch noch die miimumSizePolicy der Widgets im Splitter in die Quere kommt, aber das sollte QSplitter für dich erledigen.
AlexanderKiebler82
Beiträge: 20
Registriert: 4. Juni 2009 12:19
Kontaktdaten:

Beitrag von AlexanderKiebler82 »

Wegen code, sorry, habe ihn hier neu abgetippt, und nicht copy&paste.
Du hast natürlich recht, die for schleife ist über die lsitengröße.

Das ding mit horizontal und vertical ist klar.

Wenn ich nach

Code: Alles auswählen

list=splitter->sizes(); 
list ausgeben lasse, dann ist die Liste an jeder Stelle Null.

Code: Alles auswählen

splitter->setSize(list);
Verändert die Widgetgrößen oder eben gerade nicht ??

Des weiteren steht in der Qt doku:
The available space is divided according to the weights specified in the list.

Was sich nach einer gewichtsmäßigen aufteillung anhört. Das Prinzip habe ich absolut nicht verstanden. Dewswegen frag ich ja *ggg*
Gruß
Zuletzt geändert von AlexanderKiebler82 am 19. Juni 2009 12:39, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Dann ist das Problem dein Code. Poste mal bitte ein komplettes, kleines Testprogramm, welches deinen Fehler reproduziert.
Denn raten könnte ich jetzt viel...
Antworten