我有很多.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;
};
1条答案
按热度按时间guykilcj1#
我在Linux上的Qt 5.15.3中几乎完全做到了这一点,它似乎工作得很好。
更具体地说,我有一个从
QLabel
派生的类InfoText
和一个从QPushButton
派生的类InfoButton
。在我的.ui文件中,我有:在生成的ui_xxx. h文件中,我得到:
所以看起来你在.ui文件中所做的事情应该可以工作。
ItemLabel
类的.h或.cpp文件中是否有可能混淆Qt MOC的内容?