我目前正在研究一个Qt项目,并且对信号和插槽机制有点困惑.但我觉得我对QObject和用户界面表单之间的差异有一点了解.
用户界面表单(由.ui文件描述)被馈送到用户界面编译器(uic)并产生相关的头文件.此头文件不仅包含接口信息,而是包含应格式化QObject的实现细节.另一方面,QObject是基础类,其中构建了许多Qt框架.信号和插槽系统完全基于QObject.
在扩展QObject类(或从派生类)时,实际上是在定义一个可以产生信号和槽的对象.要将此对象格式化为您在Qt Designer中设计的用户界面,请创建ui类的实例(通过uic生成的ui标头).您在此类上调用setup方法并将其提供给您正在创建的新QObject.
这一切似乎都有道理.
然而,没有意义的是当你开始实际定义信号时.从Qt Designer开始,我可以选择右键单击并选择"信号".当我选择一个信号时(无论是鼠标点击按钮还是进度条中的更改),它最终会将其添加到我的QObjects信号部分.我的问题是:为什么以及如何?在Qt Creator中,我在Qt Designer(一个为uic生成XML的程序)中的操作到底是如何与我的QObject耦合的?更具体地说,它如何知道将此插槽添加到哪个QObject?
这个问题可能有点不清楚,所以我在这里举一个例子.
比方说,我想创建一种新的交互式显示器.我们称之为'MyScreen'.为了创建这个界面,我可能会有3个文件:'myscreen.h','myscreen.cpp'和'myscreen.ui'.'myscreen.h'负责声明QObjects属性和方法以及信号和槽.'myscreen.cpp'负责定义方法,信号和插槽.'myscreen.ui'可用于创建用于格式化MyScreen实例的用户界面布局.
但由于我之前所说的ui仅用于生成标题,为什么它与'myscreen.cpp'相关联?也就是说,我可以右键单击.ui布局,创建一个新的信号类型,并将该信号类型添加到myscreen.h和myscreen.cpp中.这是怎么发生的?怎么耦合?Qt是否运行使得应该始终存在3个文件(xxx.h,xxx.cpp,xxx.ui)?
所以希望能给你一些我困惑的背景.似乎没有一份写得很好的文件(我至少已经找到),它彻底描述了所有这些项目之间的基本关系.
TLDR - .h和.cpp的信号/插槽如何实际链接到.ui文件中定义的元素?
我理解Python中可变对象和不可变对象之间的区别.我读了许多讨论差异的帖子.但是,我没有读过任何关于WHY整数是不可变对象的内容.
这有什么原因吗?或者答案是"它就是这样"?
编辑:我被提示将此问题与其他问题"区分",因为它似乎是一个先前提出的问题.但是,我相信我所要求的更多的是一个哲学上的Python问题,而不是一个技术性的Python问题.
似乎Python中的"原始"对象(即字符串,布尔值,数字等)是不可变的.我还注意到由基元(即dicts,列表,类)组成的派生数据类型是可变的.
无论对象是否可变,是否绘制线的位置?原始vs派生?
我对Django 'staticfiles'应用程序中STATIC_URL和STATIC_ROOT之间的区别感到困惑.
我相信我理解STATIC_ROOT它是什么:它本质上是服务器上的位置,staticfiles' collectstatic命令将放置从django项目收集的静态文件.该collectstatic命令将搜索您在STATIC_FINDERS设置中指定的位置.
但是,究竟做了STATIC_URL什么呢?这应该是什么?显然,它旨在设置一些用户可以访问静态文件的东西.但这与它的关系是什么STATIC_ROOT?
为什么STATIC_URL简单的默认值/static/?是否STATIC_URL必须能够参考STATIC_ROOT?
我有一个在SVN中受到版本控制的文件(我使用tortoiseSVN).这个文件已经过时了,因此我不再希望它在我的仓库的工作副本中.但是,保留该文件的历史记录可能会很好.
我本质上想要"删除"此文件,以便不再跟踪或"版本化".我可以选择"删除"此文件,或"取消"此文件.
'delete'和'unversion'之间有什么区别?每个命令的用例是什么?
我对C中的结构有疑问.所以当你创建一个结构时,你实际上是在定义一块内存的框架.因此,当您创建结构的实例时,您正在创建一个内存块,以便它能够容纳一定数量的元素.
但是,我对点运算符的作用感到有些困惑.如果我有一个struct Car并且有一个成员GasMileage(这是一个int成员),我可以GasMileage通过做类似的事情来获得价值,
int x = CarInstance.GasMileage;
Run Code Online (Sandbox Code Playgroud)
但是,我对这个点运算符实际发生的事情感到困惑.点运算符是否只是作为基址的偏移量?它究竟是如何推断出它是一个整数?
我想我对幕后发生的事情很好奇.GasMileage通过做其他事情可以参考吗?如
int *GasMileagePointer = (&carInstance + offsetInBytes(GasMileage));
int x = *GasMileage
Run Code Online (Sandbox Code Playgroud)
这只是我快速弥补的事情.我一直在努力寻找一个好的解释,但似乎没有什么比将点运算符视为魔术更能解释它了.
我正在研究一个简单的C++程序,并且很难理解我遇到的编译器错误.这个问题是由我尝试从基类创建派生类引起的.我在下面发布了相同结构的代码,但更改了名称.
BaseClass.h
#ifndef BASECLASS_H
#define BASECLASS_H
class BaseClass {
public:
BaseClass(void);
virtual int method1(void) = 0;
virtual int method2(void) = 0;
virtual float method3(void) = 0;
};
#endif // BASECLASS_H
Run Code Online (Sandbox Code Playgroud)
DerivedClass.h
#ifndef DERIVEDCLASS_H
#define DERIVEDCLASS_H
#include "DerivedClass.h"
class DerivedClass: public BaseClass
{
public:
DerivedClass(void);
};
#endif // DERIVEDCLASS_H
Run Code Online (Sandbox Code Playgroud)
DerivedClass.cpp
#include "DerivedClass.h"
DerivedClass::DerivedClass(void)
{
}
int DerivedClass::method1(void)
{
// TODO
}
int DerivedClass::method2(void)
{
// TODO
}
float DerivedClass::method3(void)
{
// TODO
}
Run Code Online (Sandbox Code Playgroud)
尝试编译时,我得到所有虚拟方法的以下错误:
no 'int DerivedClass::methodX()' member function declared in …Run Code Online (Sandbox Code Playgroud) 我在eclipse中运行一个引用程序源文件夹中的文件的程序.但是,当我将程序导出到可运行的JAR时,程序似乎无法找到该文件.从本质上讲,该程序在eclipse中工作得很好,但是当它是一个独立的程序时却不会这样做.
我附上了一张如何在程序中引用该文件的照片.

我有一个关于在C中包含警卫的问题.我已经做了一些阅读,但我会欣赏一点澄清.
假设我有一个带有函数定义的头文件"header.h".
#ifndef HEADER_FILE
#define HEADER_FILE
int two(void){
return 2;
}
#endif
Run Code Online (Sandbox Code Playgroud)
这个头文件有一个包含保护.但是,我对#define HEADER_FILE实际上在做什么感到困惑.假设我忘记了包含守卫,完全忽略添加'#define HEADER_FILE'对我来说是完全合法的.
所以我的问题是:当我们定义HEADER_FILE时,我们到底在做什么?我们定义了什么?为什么忘记包含警卫是可以的,在这种情况下我们也忘了添加#define HEADER_FILE?
任何帮助表示赞赏!
假设我有一个概率类,其方法可以计算数组的平均值.因为这个方法可能会传递一个float,double,int等数组,所以我认为将这个方法作为模板方法是合适的.
但是当传递数组时,我必须定义数组的类型和数组的长度.所以我的问题是:如何配置模板以接受两个输入?我已经引用了网络,但看到一个好例子的运气有限.
我在下面发布了我的代码
概率标题
#ifndef COFFEEDEVMATH_PROBABILITY_H
#define COFFEEDEVMATH_PROBABILITY_H
class Probability
{
public:
Probability(void);
template <typename T, int N>
void ExpectedValueDataSet(const std::array<T, N>& data)
{
T test = data[0]; // This is irrelevant, but simply a place holder example.
}
protected:
private:
};
#endif // COFFEEDEVMATH_PROBABILITY_H
Run Code Online (Sandbox Code Playgroud)
主要
#include <iostream>
#include <Probability.h>
int main()
{
float hoor[] = {3, 3, 1, 1};
Probability prob;
prob.ExpectedValueDataSet(hoor, 4);
}
Run Code Online (Sandbox Code Playgroud) 为什么Qt必须在C++中有许多标准对象/数据结构的'Q'版本?推理是从一个源产生的(即需要附加元数据用于格式化目的),还是仅仅取决于具体情况(例如QString允许更多的语言设置,QVectors允许'什么')?
谢谢!