【发布时间】:2015-12-11 14:34:00
【问题描述】:
我在QWidget 中有一个带有QProgressBar 的ui 文件。此外,我创建了继承自QProgressBar 的自定义进度条组件。在 QT Designer 中,我可以将 QProgressBar 小部件提升为我的自定义小部件。有没有办法在小部件 cpp 文件中执行此操作而不是使用 QT Designer?
换句话说,有没有办法以编程方式将QWidget 提升为另一个相同类型的自定义小部件(一种变形)?
下面是一个例子:
class MyProgressBar : public QProgressBar
{
Q_OBJECT
public:
explicit CmdProgressWidget(QWidget *parent = 0);
~CmdProgressWidget();
int myCustomFunction();
};
class MyWidgetWithProgress : public QWidget, public Ui::MyWidget
{
Q_OBJECT
public:
MyWidgetWithProgress (QWidget *parent = 0) {setupUi(this);}
~MyWidgetWithProgress() {;}
inline int callMyCustomFunction() {progressBar->myCustomFunction();}
};
获取代码int callMyCustomFunction() 编译的常用方法是在QT Designer 中提升小部件(QProgressBar) 中的进度条到我的自定义小部件MyProgressBar。
回到最初的问题:有没有办法以编程方式进行(例如在setupUi(this); 之后的MyWidgetWithProgress 构造函数中)?
【问题讨论】:
-
“进入另一个相同类型的自定义小部件” - 最后一部分没有多大意义。如果是 same 类型,就没有什么可推广的了。你的意思是另一个自定义小部件类型继承了要提升的类型?比如,将
QProgressBar实例提升为继承QProgressBar的MyProgressBar? -
如果我理解正确,您只能替换要完全升级的小部件。您不能将对象实例随后提升为子类型,这对于 C++ 本身来说是不可能的,并且与 Qt 无关。因此,一种可能的解决方案是以编程方式创建新类型的新小部件并将属性从旧对象复制到新对象(这可以在自定义小部件类型的特殊构造函数中完成),最后在小部件中替换它树和布局。
-
话虽如此,有时在设计器中放置一个“占位符”会更容易,您可以在运行时添加自定义小部件作为孩子(使用没有边距的简单布局等,例如孩子完全填充占位符)。但是,实际的小部件在设计器中根本不存在,这使得无法直接在设计器中编辑要添加的小部件的某些属性,但通常这不是问题。当我遇到这种情况时,我大部分时间都是这样做的。
-
@leemes:是的,我想要实现的是以编程方式将来自ui的
QProgressBar实例提升为继承QProgressBar的MyProgressBar。 -
我说的是在实现文件中使用 dynamic_cast 向下转换 QProgressBar 小部件
标签: c++ qt casting qt5 qwidget