c++ 将派生QLabel与.ui文件中的好友一起使用生成错误代码

o7jaxewo  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(86)

我有很多.ui文件和派生类,但现在我决定在某些地方派生QLabel。这些使用“好友”功能。
.ui文件的相关部分:

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

...以及.ui文件底部的定义:

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

生成以下代码:

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

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

其中最后一行显然不正确,因为参数应该是QWidget *。它应该是这样的(对于非派生的QLabel s也是这样的):

item->setBuddy(icon);

看起来,对什么是好友的“神奇”理解,在派生时丢失了。也就是说,它应该意识到icon将被视为变量名而不是字符串。
有没有办法再告诉它这个魔法?(是否派生好友小部件并不重要)
使用Qt 5.15.2。我没有试过其他版本,但我确实发现了这个Qt6 migration - UIC generated code fails to compile (connect slots) - updated未回答的问题,它涉及到这个主题。
edit:下面是完整的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;
};
guykilcj

guykilcj1#

我在Linux上的Qt 5.15.3中几乎完全做到了这一点,它似乎工作得很好。
更具体地说,我有一个从QLabel派生的类InfoText和一个从QPushButton派生的类InfoButton。在我的.ui文件中,我有:

<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>

在生成的ui_xxx. h文件中,我得到:

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

所以看起来你在.ui文件中所做的事情应该可以工作。ItemLabel类的.h或.cpp文件中是否有可能混淆Qt MOC的内容?

相关问题