我在C++项目中使用外部C库.
标头包含一个带有名为的变量的结构class
:
#ifdef __cplusplus
extern "C" {
#endif
struct something_t {
...
sometype class;
};
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
g ++不喜欢这个并抱怨"错误:'之前的预期标识符';' 令牌".
我有什么选择?
class
,但这很麻烦,打破了上游兼容性.class
使用预处理器在标题中重新定义:#define class class_
是否有任何副作用?处理这种情况的最佳方法是什么?
结果:基于对选项2的普遍偏好,我最终选择在上游库中启动重命名.
我有一个python库,具有以下存储库结构:
repobase
|- mylibrary
| |- __init__.py
|- tests
|- test_mylibrary.py
Run Code Online (Sandbox Code Playgroud)
到目前为止,运行测试可以通过调用py.test
repobase目录来完成.然后import mylibrary
在test_mylibrary.py中使用repobase/mylibrary中的本地代码.
现在,我已经扩展了库以使用编译代码.因此,repobase/mylibrary的源代码本身不起作用.我必须做一个setup.py build
.这将创建repobase/build/lib.linux-x86_64-2.7/mylibrary.
是否有合理的方法使py.test使用此目录导入mylibrary?鉴于这些限制:
我不想sys.path
在test_mylibrary.py中包含任何/ import魔法,因为这可能会破坏其他环境中的测试.
我不想放弃py.test
从repobase运行的可能性.因此修改PYTHONPATH没有用,因为它.
仍然是第一个sys.path
.因此repobase/mylibrary比repobase/build/lib.linux-x86_64-2.7/mylibrary更受青睐.
如果没有,那么测试需要构建的python库的标准方法是什么?
我想使用 type 的可选参数QFileInfo
。测试调用者是否提供了值或是否使用了默认值的规范方法是什么?
// declaration
void foo(QFileInfo fi = QFileInfo());
// definition
void foo(QFileInfo fi)
{
if ( /* what to test for: "is default" */ ) {
}
}
Run Code Online (Sandbox Code Playgroud)
通常默认构造的 Qt 对象具有类似isValid()
或 的内容isEmpty()
。然而,在QFileInfo
.
一种选择是fi.filePath().isEmpty()
。有没有更好/更简单的东西?
我有一些附加到主菜单栏的全局菜单操作(下例中的“缩放”)。此外,我还附加了某些小部件的操作(下例中的“Zoom2”)。
我想对这两个操作使用相同的快捷方式。它应该像这样工作:
textEdit2
是焦点,它的动作应该消耗快捷方式(即zoom2()
应该被触发)。zoomGlobal()
。下面的当前示例尚未运行:如果textEdit2
获得焦点,Qt 会发出通知QAction::eventFilter: Ambiguous shortcut overload: Ctrl++
并且不执行任何操作。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QAction *act = menuBar()->addAction("Zoom");
act->setShortcut(QKeySequence("Ctrl++"));
connect(act, SIGNAL(triggered(bool)), this, SLOT(zoomGlobal()));
setCentralWidget(new QWidget());
QVBoxLayout *layout = new QVBoxLayout();
centralWidget()->setLayout(layout);
QTextEdit *textEdit1 = new QTextEdit();
layout->addWidget(textEdit1);
QTextEdit *textEdit2 = new QTextEdit();
layout->addWidget(textEdit2);
act = new QAction("Zoom2");
act->setShortcut(QKeySequence("Ctrl++"));
act->setShortcutContext(Qt::WidgetShortcut);
connect(act, SIGNAL(triggered(bool)), this, SLOT(zoom2()));
textEdit2->addAction(act);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让集中的小部件窃取和使用快捷方式,无论是否存在另一个带有上下文的快捷方式WindowShortcut
或ApplicationShortcut
?
当然,可以在 中编写所有内容zoomGlobal()
,检查哪个小部件处于活动状态并委托其操作。但是,如果您有很多操作和小部件,那就相当麻烦了。我希望能够添加/删除/更改小部件,textEdit2
而不需要调整 …
我有下面的代码,但它os.mkdir
不适用于我的。编译不会返回任何错误,但运行代码不会创建文件夹。
def folder():
timenow = datetime.now().strftime('%Y-%m-%d_%H%M%S')
folderpath = os.path.join(currentpath,"folder",str(timenow))
if os.path.exists(folderpath) == False:
os.mkdir(folderpath)
return
Run Code Online (Sandbox Code Playgroud) 我已经QActions
添加到QToolBar
using addAction()
.
我希望工具栏按钮工具提示显示快捷方式。例如复制(Ctrl+C)。当然,我可以静态设置
action->setTooltip(QString("%1 (%2)").arg(action.toolTip(), action->shortcut().toString(QKeySequence::NativeText)));
Run Code Online (Sandbox Code Playgroud)
然而,这非常麻烦,因为有很多操作,并且用户可以修改快捷方式,因此我必须跟踪并相应更新。如果我可以通过类似于http://doc.qt.io/qt-5/qtwidgets-widgets-tooltips-example.htmlQToolBar
的子类来简单地修改工具提示行为,那就更好了。QToolBar
不幸的是,事情没那么简单。工具提示不是由其本身生成的QToolBar
,而是显然是由QToolButton
使用时在内部创建的addAction()
。所以理想情况下我会注入我自己的QToolButton
. 但这似乎是不可能的,因为工具按钮的实际实例化是在我无法访问的私有 QToolBarLayout 内完成的。
有什么想法如何解决这个问题吗?