pythonator
pythonator

Reputation: 383

Using derived QLabel with buddy in .ui file generates incorrect code

Have plenty of .ui files with derived classes, but now I decided to derive QLabel in some places. These use the "buddy" feature.

Relevant part of the .ui file:

<widget class="ItemLabel" name="icon">
</widget>
<widget class="ItemLabel" name="item">
  <property name="buddy">
    <cstring>icon</cstring>
  </property>
</widget>

...and this definition at the bottom of the .ui file:

<customwidgets>
 <customwidget>
  <class>Itemlabel</class>
  <extends>QLabel</extends>
  <header>ui/widget/ItemLabel.h</header>
 </customwidget>
</customwidgets>

Generates this code:

icon = new ItemLabel(item_parent);
icon->setObjectName(QString::fromUtf8("icon"));

item = new ItemLabel(item_parent);
item->setObjectName(QString::fromUtf8("item"));
item->setBuddy("icon");

Where the last line is obviously incorrect as the argument should be a QWidget *. It should be (and also is, for non-derived QLabels) like this:

item->setBuddy(icon);

It seems that the "magic" understanding of what a buddy is, is lost when deriving. That is, that it should realize that the icon is to be treated as a variable name and not a string.

Is there a way to inform it about this magic again? (it does not matter if the buddy widget is derived or not)

Using, Qt 5.15.2. Haven't tried other versions, but I did find this Qt6 migration - UIC generated code fails to compile (connect slots) - updated unanswered question, which touches on this topic.

edit: Here's the complete ItemLabel.h:

#pragma once

#include <QLabel>

class QMouseEvent;

class ItemLabel : public QLabel
{
public:
    explicit ItemLabel(QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags());
    explicit ItemLabel(const QString &text, QWidget *parent=nullptr, Qt::WindowFlags f=Qt::WindowFlags());

private:
    void mouseMoveEvent(QMouseEvent *ev) override;
};

Upvotes: 0

Views: 91

Answers (1)

Matt Young
Matt Young

Reputation: 56

I've done almost exactly this in Qt 5.15.3 on Linux, and it seems to work just fine.

More specifically, I have a class InfoText that derives from QLabel and a class InfoButton that derives from QPushButton. In my .ui file, I have:

        <widget class="InfoButton" name="infoButton_name"></widget>
...
        <widget class="InfoText" name="infoText_name">
         <property name="buddy">
          <cstring>infoButton_name</cstring>
         </property>
         <property name="text">
          <string>...</string>
         </property>
        </widget>
...
 <customwidgets>
  <customwidget>
   <class>InfoButton</class>
   <extends>QPushButton</extends>
   <header>widgets/InfoButton.h</header>
  </customwidget>
  <customwidget>
   <class>InfoText</class>
   <extends>QLabel</extends>
   <header>widgets/InfoText.h</header>
  </customwidget>
...
 </customwidgets>

In the generated ui_xxx.h file, I get:

...
#if QT_CONFIG(shortcut)
        infoText_name->setBuddy(infoButton_name);
...
#endif // QT_CONFIG(shortcut)
...

So it looks like what you're doing in the .ui file should work. Is there anything in the .h or the .cpp file for your ItemLabel class that might be confusing the Qt MOC?

Upvotes: 0

Related Questions