我希望能够从我的python应用程序中调出一个交互式python终端.我的程序中的一些(但不是全部)变量需要暴露给解释器.
目前我使用子类和修改QPlainTextEdit并将所有"命令"路由到eval或exec,并在dict中跟踪单独的命名空间.然而,必须有一个更优雅和健壮的方式!怎么样?
这是一个做我想要的例子,但它是用IPython和pyGTK ... http://ipython.scipy.org/moin/Cookbook/EmbeddingInGTK
以下是我目前的情况.但是有太多的角落案例我可能错过了一些.这是非常慢,尝试一个大的打印循环...它必须是一个更简单,更少漏洞的方式,...我希望!
这个def runCommand(self)功能是理解我的问题的关键.理想情况下,我不想改进它,我宁愿用更简单,更聪明的东西来替换它的内容.
console.updateNamespace({'myVar1' : app, 'myVar2' : 1234})"main"中语句的功能也很重要.
import sys, os
import traceback
from PyQt4 import QtCore
from PyQt4 import QtGui
class Console(QtGui.QPlainTextEdit):
def __init__(self, prompt='$> ', startup_message='', parent=None):
QtGui.QPlainTextEdit.__init__(self, parent)
self.prompt = prompt
self.history = []
self.namespace = {}
self.construct = []
self.setGeometry(50, 75, 600, 400)
self.setWordWrapMode(QtGui.QTextOption.WrapAnywhere)
self.setUndoRedoEnabled(False)
self.document().setDefaultFont(QtGui.QFont("monospace", 10, QtGui.QFont.Normal))
self.showMessage(startup_message)
def updateNamespace(self, namespace):
self.namespace.update(namespace)
def showMessage(self, message):
self.appendPlainText(message)
self.newPrompt()
def newPrompt(self):
if …Run Code Online (Sandbox Code Playgroud) 我通常喜欢在编程时启用很多警告.但是,某些库包含容易导致警告的代码(..,python,Qt,..).使用gcc编译时,我可以使用-isystem而不是-I来静音.我怎么能用MS编译器做同样的事情?我知道警告#pragma,但我想要一个不涉及编译器特定代码的解决方案.我也知道我可以关闭特定的警告,但这不是我想要的.
BTW:isystem应该是这个问题的标签,但我不被允许这样做..
摘要:我希望从代码中看到所有警告,并且没有来自外部代码的警告.
考虑这段代码
Foo f1;
Foo f2{ std::move(f1) };
Run Code Online (Sandbox Code Playgroud)
我希望成员值f1不再必须保持默认构造函数给出的值.但是,使用此实现进行多个编译器的测试Foo表明不然.
class Foo
{
public:
Foo() = default;
Foo(Foo &&) = default;
std::string s{ "foo" };
bool t{ true };
bool f{ false };
};
Run Code Online (Sandbox Code Playgroud)
移动f1.t总是true并且f1.f永远是false.正如在这个问题中所描述的那样,我希望这些值要么是不确定的,要么两个布尔值都具有相同的值.但是,它们似乎获得了与默认构造函数相同的值.
这只是我的编译器的实现细节(巧合相同)还是在标准中?
我怎样才能在编译时从模板参数包中创建一个std :: array?
这显示了我需要的东西,但没有参数包.
template<typename T1, typename T2, typename T3>
struct ToInfoArray
{
static constexpr std::array<Info, 3> value = { { T1::info, T2::info, T3::info } };
};
Run Code Online (Sandbox Code Playgroud)
奖金问题:
您会使用std::array,array[]还是std::initializer_listInfoArray的类型?
我希望QFileDialog中的过滤器匹配所讨论的平台上Phonon支持的所有音频文件类型.
1 - 但是我无法在Qt中找到在过滤器中使用mime类型的方法.我怎样才能做到这一点?
2 - 或者我如何手动找到mimetypes的相应文件扩展名?解决方案应该是基于Qt的,或者至少是跨平台的,并且在任何地方都支持Qt.
选项一是我的首选解决方案,但选项二也可以.
以下是描述我的问题的简短代码:
#include <QApplication>
#include <QFileDialog>
#include <QStringList>
#include <phonon/backendcapabilities.h>
QStringList mime_to_exts(QString mime)
{
// WHAT TO REALLY DO ??
// NEEDLESS TO SAY; THIS IS WRONG...
return QStringList(mime.split("/").back().split('-').back());
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
app.setApplicationName("phononext");
QStringList p_audio_exts;
QStringList p_mime_types = Phonon::BackendCapabilities::availableMimeTypes();
for(QStringList::iterator i = p_mime_types.begin(), ie = p_mime_types.end(); i != ie; i++)
{
if((*i).startsWith("audio"))
p_audio_exts << mime_to_exts(*i);
}
QString filter = QString("All Files(*)");
if(!p_audio_exts.isEmpty())
{
QString p_audio_filter = …Run Code Online (Sandbox Code Playgroud) 我试图使用模板创建类型安全的C++标志.我也想区分一个标志和标志小号(是零,一个或多个标志).
下面的解决方案运行良好,除非EnumFlag<T> operator | (T, T)导致|枚举上的所有操作返回类型EnumFlag.这打破了很多代码.有什么技巧可以解决这个问题?在我的代码中,我执行以下操作,但是Option这里的硬编码不是一个选项.如何使这个通用?
EnumFlag<typename std::enable_if<std::is_same<T, Option>::value, T>::type> operator | (T l, T r)
Run Code Online (Sandbox Code Playgroud)
将此更改为......
EnumFlag<T> operator | (T l, T r)
Run Code Online (Sandbox Code Playgroud)
...的原因打破了一切.我想要这样的东西(不是compilabel代码).或者任何其他更好的主意!
EnumFlag<typename std::enable_if<std::already_expanded<EnumFlag<T>>::value, T>::type> operator | (T l, T r)
Run Code Online (Sandbox Code Playgroud)
完整的可编辑代码:
EnumFlag.h
#ifndef __classwith_flags_h_
#define __classwith_flags_h_
#include <type_traits>
enum class Option
{
PrintHi = 1 << 0,
PrintYo = 1 << 1,
PrintAlot = 1 << 2
};
template <typename T>
class EnumFlag
{ …Run Code Online (Sandbox Code Playgroud) #pragma message我对看到我的构建不感兴趣。它只会使输出变得混乱。
我顺便把这件事告诉了 Clang -Wno-#pragma-messages。但是,GCC 不理解该标志,并且我找不到任何类似的标志。
我如何要求 GCC 忽略#pragma message?
使用Python我想创建一个指向不存在的路径的符号链接.然而os.symlink只是抱怨"OSError:[Errno 2]没有这样的文件或目录:"..这可以很容易地用ln程序完成,但是如何在不调用Python的ln程序的情况下在Python中完成它?
编辑: 不知怎的,我真的搞砸了这个:/ ...下面的两个答案都是正确的
将用户定义的默认虚拟析构函数添加到这样的类时..
class Foo
{
public:
Foo();
virtual ~Foo() = default;
};
Run Code Online (Sandbox Code Playgroud)
.. 它具有防止自动生成移动构造函数的副作用。也不推荐自动生成复制构造函数。推荐的方法是用户像这样定义所有构造函数..
class Foo
{
public:
Foo();
virtual ~Foo() = default;
Foo(const Foo& /* other */) = default;
Foo&operator=(const Foo& /* other */) = default;
Foo(Foo&& /* other */) = default;
Foo&operator=(Foo&& /* other */) = default;
};
Run Code Online (Sandbox Code Playgroud)
然而,这是非常冗长和不可读的。有没有其他解决方案?