小编jpa*_*cek的帖子

我应该如何将QGraphicsScene与布局和小部件一起使用

我正在Qt4中创建一些显示小部件的图形数据,我很想使用QGraphicsScene它,QGraphicsItem为数据项创建s等.

但是,我想添加一些控件层(例如滚动条,缩放+其他按钮 - 我想以类似于Google地图的方式制作它,也就是说,数据会在整个小部件上显示,并且按钮将显示在小部件的顶部.因此我认为将它们添加到场景中可能是可行的(可能作为QGraphicsGroupItem将在数据上显示的子项).但是当我调整整个小部件时,我希望它们移动和调整大小,所以我应该用它QGraphicsLayout来管理它们.但在这一点上,我发现事情非常复杂.

问题是在使用时QGraphicsLayout,以下约束条件成立:

  1. 只有a QGraphicsWidget可以通过布局进行管理
  2. QGraphicsLayout 只能用于管理孩子 QGraphicsWidget

这意味着我必须创建我的控件作为QGraphicsWidgets,QGraphicsWidget为数据小部件添加顶级,并自己管理这个顶级小部件的大小.

所以我想问:

  1. 经典方法(即,对所有控件使用普通旧窗口小部件,QGraphicsScene仅用于显示数据)是否更合理?

  2. QGraphicsScene在这种情况下使用是否有任何优势(性能或简单性......)?

  3. 我应该如何QGraphicsScene利用它的优势?

c++ user-interface qt qt4 qgraphicsview

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

解压缩Scala中的元组类型

我只是想知道,我可以将元组类型分解为Scala中的组件类型吗?

我的意思是,这样的事情

trait Container {
  type Element
}

trait AssociativeContainer extends Container {
  type Element <: (Unit, Unit)
  def get(x : Element#First) : Element#Second
}
Run Code Online (Sandbox Code Playgroud)

types scala tuples

7
推荐指数
1
解决办法
2740
查看次数

如何让"GDB"在"踏入"时不打印功能参数值?

当遇到断点并进入函数时,gdb版本6.8打印函数的名称,后跟函数参数.

事实恰巧,在我调试的程序中,其中一个参数值是通过引用传递的巨大记录.gdb打印变量名称,后跟其所有成员变量.它实际上需要gdb一两分钟来打印类中包含的所有成员变量...这在调试时非常烦人.

我很确定有一个设置可以禁用此行为,该设置是什么?

debugging gdb

7
推荐指数
1
解决办法
4505
查看次数

从BEGIN块中调用Perl fork

fork在从BEGIN块中调用Perl时,我无法理解Perl中的行为.在perlfork中,我读到了这个

BEGIN块

fork()BEGIN块内调用时,仿真将无法完全正常工作.分叉副本将运行BEGIN块的内容,但不会在BEGIN块之后继续解析源流.例如,请考虑以下代码:

BEGIN {
    fork and exit;      # fork child and exit the parent
    print "inner\n";
}
print "outer\n";
Run Code Online (Sandbox Code Playgroud)

这将打印:

inner
Run Code Online (Sandbox Code Playgroud)

而不是预期的:

inner
outer
Run Code Online (Sandbox Code Playgroud)

但是,正如我所读到的,这仅适用于fork模拟的平台.既然我关心(并测试代码)Linux,那应该不是问题,不是吗?

实际上,如果我从该文档中复制示例代码

BEGIN {
    fork and exit;
    print "inner\n";
}
print "outer\n";
Run Code Online (Sandbox Code Playgroud)

这就是我运行它时会发生的事情

jirka@debian:~/xpath$ perl /tmp/test.pl
jirka@debian:~/xpath$ inner
outer
Run Code Online (Sandbox Code Playgroud)

这似乎是一致的.

但是,当我删除时,exit我希望同时拥有父进程和子进程.那不符合我的预期.

这是我的新代码

BEGIN {
    fork;
    print "inner\n";
}
print "outer\n";
Run Code Online (Sandbox Code Playgroud)

这是奔跑

jirka@debian:~/xpath$ perl /tmp/test.pl
inner
outer
jirka@debian:~/xpath$ inner
Run Code Online (Sandbox Code Playgroud)

我期待两个 …

perl posix fork

7
推荐指数
1
解决办法
269
查看次数

在Linux平台上使用套接字时是否存在文件描述符泄漏?

如果我通过调用例如打开和关闭套接字

Socket s = new Socket( ... );
s.setReuseAddress(true);
in = s.getInputStream();
...
in.close(); 
s.close();      
Run Code Online (Sandbox Code Playgroud)

Linux声明此套接字仍处于打开状态,或者至少是连接的文件描述符.当lsof查询此进程的打开文件时,有一个关闭连接的条目:

COMMAND  PID   USER   FD   TYPE DEVICE     SIZE   NODE NAME
java    9268 user    5u  sock    0,4           93417 can't identify protocol
Run Code Online (Sandbox Code Playgroud)

此条目将一直保留到程序关闭之前.有没有其他方法可以最终关闭套接字?我有点担心我的java应用程序可能会阻塞许多文件描述符.这可能吗?或者,即使重新设置了ReuseAdress,java还是会保留这些套接字来重用它们吗?

java sockets linux file-descriptor

6
推荐指数
1
解决办法
9163
查看次数

Runtime.getRuntime().exec(),隐藏控制台屏幕

我正在使用Java代码执行批处理文件.代码如下:

Process proc = null;

proc = Runtime.getRuntime().exec("cmd /c start somebat.bat");
Run Code Online (Sandbox Code Playgroud)

这样,正常的命令提示屏幕就会打开.现在我想要压缩/隐藏命令提示符窗口(黑色).我找到了某个地方,如果我从命令中删除了start属性,它就不会出现,但是当从命令中删除它时,命令不会执行,也不会显示异常.

任何人都能告诉我如何压制这个窗口吗?

java runtime.exec

5
推荐指数
2
解决办法
2万
查看次数

ANTLR:Unicode字符扫描

问题:无法正确打印Unicode字符.

这是我的语法:

options { k=1; filter=true;
 // Allow any char but \uFFFF (16 bit -1)
charVocabulary='\u0000'..'\uFFFE'; 
}

ANYCHAR :'$'
|    '_' { System.out.println("Found underscore: "+getText()); }
|    'a'..'z' { System.out.println("Found alpha: "+getText()); }
|    '\u0080'..'\ufffe' { System.out.println("Found unicode: "+getText()); }
; 
Run Code Online (Sandbox Code Playgroud)

调用词法分析器的main方法的代码片段:

public static void main(String[] args) {
SimpleLexer simpleLexer = new SimpleLexer(System.in);
while(true) {
try {
Token t = simpleLexer.nextToken();
System.out.println("Token : "+t);

} catch(Exception e) {}

}
}
Run Code Online (Sandbox Code Playgroud)

对于输入"ठ",我得到以下输出:

Found unicode: 
Token : ["à",<5>,line=1,col=7]
Found unicode: …
Run Code Online (Sandbox Code Playgroud)

java antlr lexer

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

如何按名称获取函数地址?

我想按名称获取函数的地址。

例如,目前我正在使用dlsym

unsigned long get_func_addr(const char *func_name)
{
     return (unsigned long)dlsym(NULL, func_name);
}
Run Code Online (Sandbox Code Playgroud)

但是,dlsym仅适用于外部功能。它不适用于静态功能。我知道在不同的文件中可以有多个同名的静态函数。但是我至少需要获得一个带有名称的静态函数的地址。有时静态函数会被内联。但是如果用调试编译C文件就可以了。我认为-g,静态函数的符号表是存在的,但我如何访问它?

我不想创建一个表来将字符串映射到函数地址。我需要找到一种方法来动态地做到这一点。

c function dynamic-linking

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

我应该如何使用Perl URI类?

我需要在Perl程序中处理一些HTTP URL,但我怀疑这个URI类应该如何帮助我.

特别是,我希望使用URI该类来解析相对URL并获取它们的组件.但问题是:

  1. 我需要一个函数来处理URI对象和URI字符串作为参数(或确保只传递一个)

    sub foo_string_or_url {
      my $uri = URI->new(shift);
    
    Run Code Online (Sandbox Code Playgroud)

    这是正确的方法吗?我不太喜欢它,因为它URI不必要地串化并创建新对象.

  2. 提取组件

    my $host = $uri->host;
    
    Run Code Online (Sandbox Code Playgroud)

    这也是有问题的,因为并非所有URIs都有主机,特别是如果有人将垃圾传递给函数,这将是die().

  3. 解析相对URL

    my $new_url = URI::URL->new($uri, $base)->abs;
    
    Run Code Online (Sandbox Code Playgroud)

    IIUC,没有->abs,结果仍然会串联到相对URL(并且不适用于HTTP::Requests),我是对的吗?此外,这是否保证返回URI

我该如何处理这些问题?可能性是

  • 使用->isa('URI')->can("host")所有时间
    • 对我来说似乎容易出错并且很难看
  • 根本不使用URI类并使用正则表达式解析URL
    • 我仍然宁愿使用库解决方案而不是自己调试
  • 包裹URI操作try { ... } catch { ... }
    • 看到第一点

使用这些URI课程是否有一种理智,傻瓜的方式?我没有想到的简单(在上面的列表中)?

oop url perl

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

在与模板专业化交朋友时可能存在gcc错误

在回答关于SO的不同问题时,我遇到了一个与gcc有点可疑的编译器错误.有问题的片段是

template <class T> class A;
template <class T, class U>
void operator*(A<T>, A<U>);

template <class T>
class A {
    friend void ::operator*(A<T>, A<T>);
...
Run Code Online (Sandbox Code Playgroud)

最后一行给出了着名的警告

friend declament' void operator*(A<T>, A<T>)'声明一个非模板函数

导致以后的硬错误.完整的代码可以在这里找到.

现在,问题是我不认为这种行为是恰当的.[temp.friend]/1中的标准说:

对于不是模板声明的友元函数声明:

- 如果朋友的名称是限定或不合格的模板ID,则友元声明引用功能模板的特化,否则

- 如果friend的名称是qualified-id并且在指定的类或命名空间中找到匹配的nontemplate函数,则friend声明引用该函数,否则,

- 如果friend的名称是qualified-id并且 在指定的类或命名空间中找到了模板函数的匹配特化,则friend声明引用该函数的特化,否则,

这是C++ 03; C++ 11包含类似的子句


模板的特化由[temp.spec]/4定义:

...专门化是实例化或显式专用的类,函数或类成员(14.7.3).

和[temp.fct.spec]/1:

从函数模板实例化的函数称为函数模板特化; 所以是函数模板的显式特化.模板参数可以明确指定...

[temp.arg.explicit]/2说明了为函数规范指定模板参数列表:

当引用函数模板的特化时,可以指定模板参数列表

...

- 在朋友声明中.

可以推导出的尾随模板参数(14.8.2)可以从显式模板参数列表中省略.如果可以推导出所有模板参数,则可以省略它们; 在这种情况下,也可以省略空模板参数列表<>本身.

所以,通过[temp.fct.spec]/1,::operator*<T,T>(A<T>, A<T>)是一个函数模板专门化; 并且由于可以推导出模板参数,因此可以将其称为::operator*(A<T>, A<T>).所以我总结了friend声明中的qualified-id表示一个函数模板特化.


我认为强调的条件已经实现; 因此,友元声明应该与运营商模板(隐式)专业化的类成为朋友.然而,gcc认为不然,并继续第四个子弹,只涉及由不合格的id指定的朋友,即使这个朋友实际上是由一个合格的id命名 …

c++ templates class

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