小编rba*_*dar的帖子

为什么 QList::at() 不检查索引是否存在并返回只读值?

这个问题更多的是一种询问,而不是实际寻求问题的解决方案。

QList::at()不仅不检查索引是否越界,而且还返回 aconst因此它只能在以下场景中使用read-only

const T &QList::at(int i) const

返回列表中索引位置 i 处的项目。i 必须是列表中的有效索引位置(即,0 <= i < size())。

这个函数非常快(恒定时间)。

我刚刚在尝试为列表中的元素分配新值时发现了这些特殊的实现细节QList,我想知道是否有这样做的理由。

不检查索引有效性

如果C++ STL我们采取std::arraystd::vector(我不采取std::list,因为它根本没有std::list::at()),我们有以下内容:

std::向量::at

该函数自动检查 n 是否在向量中有效元素的范围内,如果不在则抛出 out_of_range 异常

起初我以为不包括检查是为了确保“这个功能非常快(恒定时间)”。然而,在查看了实现之后,QList我不得不说,即使包含恒定时间(并且高速)的检查,也绝对可以保证。

检查越界需要两件事(据我所知):

  • 检查给定索引是否< 0 - 这是一个恒定时间检查(O(1)如果我们使用一些古怪的符号)。显然我们不能有负索引(我们可以,Python但它有另一个含义;))
  • 检查给定索引是否< QList::size()- 常数时间也存在于此,因为QList::size()实现方式是:

    inline int size() const Q_DECL_NOTHROW { return d->end - d->begin; }
    
    Run Code Online (Sandbox Code Playgroud)

    这又是O(1)(如果我没记错的话),因为这两个值都存储在QList::d参数内,该参数是指向 …

c++ indexing stl constants qlist

5
推荐指数
1
解决办法
4129
查看次数

在不调用 setSizeIcon() 的情况下动态调整 QIcon 的大小

我目前正在努力解决什么应该很容易解决的问题。许多小部件支持某种QSizePolicy。这包括QPushbutton。在我的情况下,我在网格布局中有多个按钮,所有这些按钮的 QSizePolicy垂直和水平调整大小都设置为expand。这导致根据网格布局所属的小部件的大小调整按钮大小的 nead 结果。

问题来自 Qt 中图标的处理方式。QIcon 没有 QSizePolicy 属性(或者至少我无法在 Qt4 的官方文档中找到关于QIconQAbstractButton 的属性)。唯一的方法似乎是使用setIconSize(),您可以在其中提供图标的最大大小。此外,必须手动实施关于如何更新大小的例程。在这种情况下,它将是(这里抽象写作)icon.size == button.size-CONSTANT,其中 CONSTANT 是某种预定义的因子(> = 0)。为所选图标预定义各种尺寸(QIcons 列表)也是可能的,但仍然不是一个好的选择(请阅读下面的原因)。

这似乎有点矫枉过正,特别是因为 QPushbutton 支持 QSizePolicy 并且开发人员根本不必修补这个部门,除非他/她想要一些特殊的调整大小。这也与QIcon对 SVG 文件的支持相矛盾,因为众所周知,SVG = 矢量图形 = 您可以随意拉伸这些文件而不会降低质量。

有没有人知道一种简单的方法来做到这一点,而无需添加额外的偶数句柄来调整大小,提供所选图标的比例列表或将大小限制为最大大小?

PS:我也研究过 QPixmap - 那里仍然存在同样的问题。

编辑: 我忘了提一个方式,我发现了如何做我想要的(结果却不如漂亮,我希望他们是) -使用图像在样式表属性QPushbutton。但是,这不会创建图标!如果一个人真的不需要一个真正的图标并且可以使用这个属性来使用一个绘制的按钮,那么在调整大小方面会有很大的灵活性,尤其是在使用 SVG 时。

c++ qt svg pyqt4 autoresize

4
推荐指数
1
解决办法
4709
查看次数

Python - 元组和内存管理

在回答与Python相关的问题时,我做了一些实验,发现了一个我无法弄清楚的与元组相关的事情:我很难理解为什么空元组比其中包含单个元素的元组占用更多空间(根据sys.getsizeof()) 。下面的代码是在 64 位 Debian Jessie 系统上使用 Python 2.7.9 的上游版本执行的(也使用 Python 3.4.2 进行了测试,其中值略有不同,但我正在讨论的整体行为仍然存在):

>> sys.getsizeof(())
56
>> sys.getsizeof((1))
24
>> sys.getsizeof((1,2))
72
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,空元组与单项元组之间存在很大差异(更准确地说是 2.3 倍)。你知道这里发生了什么吗?由于元组是递归数据结构,我假设sys.getsizeof()返回的值是元组对象本身占用的内存量加上对其包含的对象的引用(如果元组将元素存储为引用而不是值 - 我不知道)。我最初的想法是,像字典一样,元组是在内存中创建的,具有一定的默认大小,可以容纳几个元素。我忘记了空字典保留内存的确切元素数量,但这就是我的一个小例子的意思:

>> sys.getsizeof({})
280
>> sys.getsizeof({"a":0})
280
>> sys.getsizeof({"a":0, "b":1})
280
Run Code Online (Sandbox Code Playgroud)

然而,查看元组似乎并没有表现出相同的行为,因为元组在第一个元素添加到较小的尺寸后会收缩,然后随着添加到其中的每个元素而增长(如预期)。除此之外,列表似乎没有遭受相同的行为:

>> sys.getsizeof([])
72
>> sys.getsizeof([1])
80
>> sys.getsizeof([1,2])
88
Run Code Online (Sandbox Code Playgroud)

空列表在内存方面比具有 1 个或多个元素的列表小 - 完全正常。

我的第二个想法是,单元素元组以某种方式转换为它包含的单个对象,并且所有内容都以某种方式包装,以便看起来它实际上是一个列表(这就是len()工作的原因)。例子:

>> sys.getsizeof((1))
24
>> sys.getsizeof(1)
24
Run Code Online (Sandbox Code Playgroud)

这似乎是可能的,但我不相信它真的发生了。

python tuples python-2.7 python-3.x

3
推荐指数
2
解决办法
2065
查看次数

根据内容的变化从 QWizardPage 动态添加/删除 Finish

我正在学习关于许可向导(使用PyQt5)的教程,尝试学习如何创建非线性向导。但是我似乎被困在一个问题上。

我想要一个页面,QComboBox其中所选项目确定QWizardPage包含组合框的当前页面是否为最终页面。

到目前为止,该页面包含的内容如下:

class CalibrationPageSource(QWizardPage):
    def __init__(self, parent):
        super(CalibrationPageSource, self).__init__(parent)
        self.setTitle('Calibration Wizard')
        self.setSubTitle('Select the source for the calibration')

        layout = QVBoxLayout()
        label = QLabel('''
            <ul>
                <li><b>From calibration file</b>: browse and select an existing YAML calibration file that contains the camera matrix and distortion coefficients (for example from a previous calibration)</li>
                <li><b>From image files</b>: browse and select one or more image files with the calibration pattern visible inside each</li>
                <li><b>From stream</b> - if …
Run Code Online (Sandbox Code Playgroud)

qt pyqt wizard transitions pyqt5

3
推荐指数
1
解决办法
1641
查看次数

尝试通过运行 Tkinter 的发送进程在进程之间的管道发送任何内容时出现管道损坏错误

我正在使用Pipe模块ProcessmultiprocessingPython 3.8)。我的初始程序如下所示:

from multiprocessing import Process, Pipe


class Process1(object):
    def __init__(self, pipe_out):
        self.pipe_out = pipe_out

        self.run()

    def run(self):
        try:
            while True:
                print("Sending message to process 2")
                self.pipe_out.send(["hello"])
        except KeyboardInterrupt:
            pass


class Process2(object):
    def __init__(self, pipe_in):
        self.pipe_in = pipe_in

        self.run()

    def run(self):
        try:
            while self.pipe_in.poll():
                request = self.pipe_in.recv()
                method = request[0]
                args = request[1:]

                try:
                    getattr(self, method + "_callback")(*args)
                except AttributeError as ae:
                    print("Unknown callback received from pipe", str(ae))

            print("Process 2 done with receiving")
        except …
Run Code Online (Sandbox Code Playgroud)

python tkinter pipe multiprocessing python-multiprocessing

3
推荐指数
1
解决办法
1051
查看次数

C#接口对象列表 - 转换单个元素

我有一个C#问题,过去几天一直困扰着我.我将尝试根据我正在做的事情的抽象描述来解释它.希望很容易遵循.;)

假设我们有一个界面

interface iFoo {
   void a();
}
Run Code Online (Sandbox Code Playgroud)

此外,我有两个实现此接口的类及其中的方法:

class bar1 : iFoo
{
   public void a() { Console.WriteLine("bar1"); }
   public void anotherMethodBar1() { Console.Write("I love "); }
}

class bar2 : iFoo
{
   public void a() { Console.WriteLine("bar2"); }
   public void anotherMethodBar2() { Console.Write("beer"); }
}
Run Code Online (Sandbox Code Playgroud)

每个类还提供了一个额外的唯一方法 - anotherMethodBar1()和anotherMethodBar2().现在在我的main()中我想创建一个列表,其中包含实现我的界面的对象,如下所示:

namespace ExampleFooBar
{
    class Program
    {
        static void Main(string[] args)
        {
            List<iFoo> fooBarObjects = new List<iFoo>();
            fooBarObjects.Add(new bar1());
            fooBarObjects.Add(new bar2());

            for(int i = 0; i < fooBarObjects.Count; i++)
            {
                if(fooBarObjects[i].GetType() …
Run Code Online (Sandbox Code Playgroud)

c# methods casting interface list

2
推荐指数
1
解决办法
5613
查看次数

未捕获的TypeError:调用getElementById()后无法读取null的属性'appendChild'

我刚开始学习JavaScript(正确:D),我很难处理上面提到的错误.我正在使用的浏览器是Google ChromeDebian Jessie 64bit系统的最新版本.代码嵌入在<script/>我的页面标记内:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
    <head/>

    <body bgcolor="white">
        <p><u>Counter:</u></p>
        <div id="counter"/>
        <p><u>Temperature conversion:</u></p>
        <div id="temperature"/>
        <script type="text/javascript">
            function printRange(_from, _to) {
                // ...
            }

            function fahrenheitToCelsius(fahrenheits) {
                return 5/9 * (fahrenheits - 32);
            }

            document.getElementById("counter").innerHTML = printRange(2,-10); // (1)

            var fahrenheits = prompt("Enter Fahreheit degrees", 50);
            var celsius = fahrenheitToCelsius(fahrenheits);
            var para = document.createElement("p");
            para.textContent = fahrenheits + "F = " + celsius + "oC";
            document.getElementById("temperature").appendChild(para); // …
Run Code Online (Sandbox Code Playgroud)

javascript null getelementbyid

2
推荐指数
1
解决办法
222
查看次数

QML报告ReferenceError:未在添加到上下文的C ++对象上定义XYZ

我最近开始学习QML(很久以前就尝试过),但是我一直坚持Qt C++代码与之交互的方式QML,反之亦然。

我有一个Counter具有以下标题:

#include <QObject>
#include <QTimer>

class Counter : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int count
           READ getCount
           WRITE setCount
           NOTIFY signalCountChanged)
public:
    Counter(QObject *parent = Q_NULLPTR);
    int getCount();
    void setCount(int count);
signals:
    void signalCountChanged(int);
public slots:
    void slotStart();
private slots:
    void slotTimeout();
private:
    int count;
    QTimer *timer;
};
Run Code Online (Sandbox Code Playgroud)

main.cpp的如下:

#include <QtGui/QGuiApplication>
#include <QtQml/QQmlContext>
#include <QtGui/QGuiApplication>
#include <QtQuick/QQuickItem>
#include <QtQuick/QQuickView>
#include "counter.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, …
Run Code Online (Sandbox Code Playgroud)

javascript c++ qt referenceerror qml

2
推荐指数
1
解决办法
1315
查看次数

了解QHash在找不到密钥时的作用

注意:您可以在本文末尾找到一个最小的工作示例.

我正在使用Qt 5.7.假设我有以下内容QHash:

QHash<HashKey, HashValue> hm;
Run Code Online (Sandbox Code Playgroud)

enum HashKey {
    K1,
    K2,
    K3,
    K4,
    K5
}
Run Code Online (Sandbox Code Playgroud)

class HashValue {
    public:
        int x;
        HashValue(int x) {
            this->x = x;
        }
}
Run Code Online (Sandbox Code Playgroud)

我已经像这样初始化了哈希映射:

hm.insert(K1, HashValue((int)K1));
hm.insert(K2, HashValue((int)K2));
hm.insert(K3, HashValue((int)K3));
hm.insert(K4, HashValue((int)K4));
hm.insert(K5, HashValue((int)K5));
Run Code Online (Sandbox Code Playgroud)

我通过电话测试了它

cout << hm.value(K4).x << endl;
cout << hm.find(K4).value().x << endl;
Run Code Online (Sandbox Code Playgroud)

两者都返回相同的结果3.现在我尝试使用一个不是哈希映射的一部分的键来做同样的操作,方法是将一个整数转换为HashKey并调用上面两个方法:

cout << hm.value(static_cast<HashKey>(100)).x << endl;
cout << hm.find(static_cast<HashKey>(100)).value().x << endl;
Run Code Online (Sandbox Code Playgroud)

我得到的是8(第一次打电话value().x)和5(第二次打电话 …

c++ hash qt key qhash

2
推荐指数
1
解决办法
3202
查看次数

仅显示 QTabWidget 中选项卡的工具提示,而不是整个小部件

我正在使用 Qt Designer 和 UI 表单。Qt 的目标版本是最新的 PySide2 (Qt 5.x)。

我已向我的QTabWidget. 此外,我还向每个选项卡(也称为页面)中的多个其他组件添加了工具提示。我注意到,每当我的鼠标悬停在选项卡内的某个区域(没有其他带有工具提示的小部件)上方(有足够的时间来触发工具提示)时,我都会获得该选项卡的工具提示。

我正在寻找的行为是仅当鼠标悬停在选项卡标题上时才显示选项卡工具提示。否则,我最终会遇到奇怪的情况,例如当我悬停时,选项卡的工具提示会弹出,假设该选项卡中的按钮没有自己的工具提示。往好了说是丑陋的,往坏了说是让用户感到困惑。

有没有简单的方法可以防止这种情况发生?我不得不承认,我在以前的项目中很少使用工具提示,但现在我决定更加关注该功能。

python tabs tooltip qtabwidget pyside2

2
推荐指数
1
解决办法
1231
查看次数