我在 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 构造函数中)?
最佳答案
Is there a way to do this in the widget cpp file instead of using QT Designer?
一般来说:没有。 Qt Designer 生成一个 Xyz.ui文件,对象树和对象属性的简单 XML 描述。 uic代码生成器采用 .ui文件并生成 ui_Xyz.h .其成员的类型已设置:您无法以编程方式更改它们,就像您无法以编程方式更改任何其他成员的类型一样。
因此,请在设计器中使用正确的对象类型。如果您将某些基类型(比如 QProgressBar)提升为您自己的派生类型,则 setupUi将创建您的类型的实例。这样,整个问题就消失了。
但您不需要更改 .ui使用设计器的文件。您可以手动更改它以推广您需要的小部件。假设我们从一个简单的小部件开始,其中有一个进度条:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>256</width>
<height>40</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QProgressBar" name="placeholder">
<property name="value">
<number>24</number>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
更改 progressBar 的类型项目,您必须对 XML 文件进行两项更改。首先,更改项目本身的类型:
<widget class="MyProgressBar" name="placeholder">
<property name="value">
<number>24</number>
</property>
</widget>
然后将您的类型添加到 <customwidgets>项目:
<customwidgets>
<customwidget>
<class>MyProgressBar</class>
<extends>QProgressBar</extends>
<header>myprogressbar.h</header>
</customwidget>
</customwidgets>
如果您实际上打算有一个不正确的 .ui文件,您可以在运行时进行小部件交换。
这有两个主要方面:
您真的需要自定义类型吗?
在许多情况下,您可以在不从基本小部件派生的情况下做任何事情。这对你是否有意义很难说:我不明白为什么你不能在你的 MyProgressBar 中使用正确的类型( .ui )文件。
// Would-Be Derived Class
class MyProgressBar : public QProgressBar {
int m_var;
protected:
void paintEvent(QPaintEvent * ev) {
QProgressBar::paintEvent(event(ev)); // let the base class paint itself
QPainter p(this);
// do some overpainting, etc.
}
public:
void doSomething() {
m_var = 3;
}
};
// Do the same using the base class instead:
void doSomething(QProgressBar * bar) {
bar.setProperty("m_var", 3);
}
void paintEvent(QWidget * w, QPaintEvent * ev) {
w->event(ev); // let the base class paint itself
QPainter p(w);
// do some overpainting, etc.
}
struct Painter : public QObject {
bool eventFilter(QObject * obj, QEvent * ev) {
if (obj->isWidgetType() && ev->type() == QEvent::Paint)
paintEvent(static_cast<QWidget*>(obj), static_cast<QPaintEvent*>(ev));
return QObject::eventFilter(obj, ev);
}
}
QProgressBar bar;
bar.installEventFilter(new Painter(&bar));
进行替换。
您需要通过正确类型的指针/引用/值访问小部件。理想情况下,直接按值存储新小部件。
class Form : public QWidget, private Ui::Form {
MyProgressBar m_bar;
...
}
然后,将其布局中的占位符小部件替换为适当类型的实例。
void replace(QWidget * & old, QWidget * replacement) {
auto layout = old->parent()->layout();
// name the new widget the same
replacement->setObjectName(old->objectName());
// swap the widgets and delete the layout item
delete layout->replaceWidget(old, replacement);
// delete the old widget
delete old;
// don't leave a dangling pointer
old = nullptr;
}
Form:: Form(QWidget * parent) :
QWidget(parent)
{
setupUi(this);
replace(placeholder, &m_bar);
// you have to manually connect slots for the m_bar widget
}
关于c++ - 以编程方式推广 QWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584320/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac