[Qt] TStatusBar, switching between SimplePanel and panel items

Juha Manninen juha.manninen62 at gmail.com
Wed Feb 2 17:35:55 CET 2011


TStatusBar can define both SimpleText and panel items. SimplePanel boolean 
property switces between them. It works with other widgetsets but not with QT.
The same problem happens at both design and run time.
I planned to fix it and create a patch... yes, that was the plan...

If SimplePanel = False initially, panels are shown, then you can switch it to 
True and you get the SimpleText. After that nothing happens, the same 
SimpleText shows always.
Then I noticed, if SimpleText = '' then the switching works. So I tied to fix 
TQtWSStatusBar.RecreatePanels like this: (see "added line")

class procedure TQtWSStatusBar.RecreatePanels(const AStatusBar: TStatusBar;
  const Widget: TQtStatusBar);
var
  Str: WideString;
  i: Integer;
begin
  ClearPanels(Widget);
  if AStatusBar.SimplePanel then
  begin
    Str := GetUtf8String(AStatusBar.SimpleText);
    Widget.showMessage(@Str);
  end else
  if AStatusBar.Panels.Count > 0 then
  begin
    Str := ''; Widget.showMessage(@Str);  // <-- added line !!!
    Widget.setUpdatesEnabled(False);
    SetLength(Widget.Panels, AStatusBar.Panels.Count);
    for i := 0 to AStatusBar.Panels.Count - 1 do
    begin
      Str := GetUtf8String(AStatusBar.Panels[i].Text);
      Widget.Panels[i] := TQtStatusBarPanel.CreateFrom(AStatusBar,
        QLabel_create(@Str, Widget.Widget));
      Widget.Panels[i].HasPaint := AStatusBar.Panels[i].Style = psOwnerDraw;
      Widget.Panels[i].ID := AStatusBar.Panels[i].ID;
      QLabel_setText(QLabelH(Widget.Panels[i].Widget), @Str);
      QLabel_setAlignment(QLabelH(Widget.Panels[i].Widget),
        AlignmentToQtAlignmentMap[AStatusBar.Panels[i].Alignment]);
      QWidget_setMinimumWidth(Widget.Panels[i].Widget, 
AStatusBar.Panels[i].Width);
      Widget.Panels[i].AttachEvents;
      Widget.addWidget(Widget.Panels[i].Widget, ord(i = 
AStatusBar.Panels.Count - 1));
    end;
    Widget.setUpdatesEnabled(True);
  end;
end;


Didn't help. Then I thought I will create the panel like the other panels are 
created. Like this:

...
  ClearPanels(Widget);
  if AStatusBar.SimplePanel then
  begin
    Str := GetUtf8String(AStatusBar.SimpleText);
    Widget.Panels[0] := TQtStatusBarPanel.CreateFrom(AStatusBar,
      QLabel_create(@Str, Widget.Widget));
    Widget.Panels[0].ID := AStatusBar.Panels[0].ID;
    QLabel_setText(QLabelH(Widget.Panels[0].Widget), @Str);
    Widget.addWidget(Widget.Panels[0].Widget, 1);
  end else
...

Didn't help either. It works as well as the earlier version though.
How can you Zeljan make such binding code work? Uhhh!


Regards,
Juha




More information about the Qt mailing list