Seite 1 von 1

Splitter an Mauspotition setzen

Verfasst: 18. Juni 2009 16:19
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

Verfasst: 18. Juni 2009 17:45
von The User
Meinst du jetzt einen QSplitter oder was? Der hat natürlich QWidget::move.

Splitter an Mauspotition setzen

Verfasst: 19. Juni 2009 10:04
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

Verfasst: 19. Juni 2009 10:21
von franzf
QSplitter::setSizes().
Musst dir halt die korrekten sizes mit dem Klick ausrechnen.

Verfasst: 19. Juni 2009 11:58
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ß

Verfasst: 19. Juni 2009 12:07
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.

Verfasst: 19. Juni 2009 12:23
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ß

Verfasst: 19. Juni 2009 12:38
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...