小编Tim*_* MB的帖子

Qt是否有与Boost的assign模块相同的东西?

在Boost中,有一些方便的功能可以让您在一行中填充容器.

例如,list_of允许您填写类似的列表.

#include <boost/assign/list_of.hpp> // for 'list_of()'
#include <list>
std::list<int> primes = boost::assign::list_of(2)(3)(5)(7)(11);
Run Code Online (Sandbox Code Playgroud)

在我的项目中我使用Qt并且不能使用Boost.有没有一种同样方便的方法来填充Qt的容器在施工点?

c++ qt containers boost

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

在使用py2app构建PySide应用程序包时,QApplication没有在主线程中运行

我在使用py2app构建我的PySide Python应用程序时遇到了问题(对于OS X).似乎应用程序包上的线程发生了一些有趣的事情.

这是最小的例子

from PySide.QtCore import *
from PySide.QtGui import *
import sys

class App(QApplication):
    def __init__(self):
        QApplication.__init__(self, sys.argv, True)

        self.timer = QTimer(self)


if __name__=='__main__':
    app = App()
    app.exec_()
Run Code Online (Sandbox Code Playgroud)

从命令行运行:python test.py,这没有错误.然而,当我使用以下setup.py编译它时:

from setuptools import setup
import py2app
import PySide

APP = ['test.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': False,
            'includes' : 'PySide',
            'resources' : "qt_menu.nib"
            }

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)
Run Code Online (Sandbox Code Playgroud)

这些错误出现在控制台中:

11/05/2013 13:54:20.958 [0x0-0xb37b37].org.pythonmac.unspecified.test: QObject: Cannot create children for a parent that is in …
Run Code Online (Sandbox Code Playgroud)

python multithreading pyqt py2app pyside

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

有什么办法可以将DECLTYPE转换为宏中的字符串?

有什么办法可以decltype在C ++宏中进行评估?我的主要动机是创建一个能够确定其类型this并将其转换为字符串的宏。

如果无法使用,decltype是否还有其他方法可以在类声明中使用宏来获取字符串的类类型?

c++ decltype c-preprocessor

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

自升级到Qt5以来,QGLShaderProgram将不会编译任何着色器

我发现QGLShaderProgram始终无法编译任何着色器,并且没有提供错误日志。以下是症状:

  • QGLShaderProgram报告它编译失败,但是产生了一个空的错误日志。如果我尝试绑定着色器,则会引发异常。
  • 我可以glCompileShader毫无问题地编译着色器。但是,我第一次尝试以这种方式 QGLShaderProgram失败进行编译时,失败,并显示以下错误日志:

    错误:错误(#270)内部错误:符号表级别
    错误错误:0:2:错误(#232)函数声明不能​​在函数内部发生:

    错误:错误(#273)2个编译错误。没有生成代码

    在那一次失败之后,下一次我尝试使用进行编译时glCompileShader效果很好。

  • 仅从Qt 4.8升级到5.2后才出现问题。在这台机器上没有其他改变。

  • 我已经在两台PC上进行了测试,一台使用ATI Radeon HD 5700,另一台使用AMD FirePro V7900。该问题仅出现在Radeon PC上。

这是证明问题的我的测试代码:

main.cpp

#include <QApplication>
#include "Test.h"

int main(int argc, char* argv[])
{
    QApplication* app = new QApplication(argc, argv);
    Drawer* drawer = new Drawer;
    return app->exec();
}
Run Code Online (Sandbox Code Playgroud)

测试

#pragma once
#include <qobject>
#include <QTimer>
#include <QWindow>
#include <QOpenGLContext>
#include <QOpenGLFunctions>

class Drawer : public QWindow, protected QOpenGLFunctions
{
    Q_OBJECT;

public:
    Drawer();

    QTimer* mTimer;
    QOpenGLContext* mContext;
    int …
Run Code Online (Sandbox Code Playgroud)

c++ opengl shader qt qt5

5
推荐指数
0
解决办法
1664
查看次数

在循环范围之外声明参数是否更有效?

有时在查看优化代码时,我发现仅在循环范围内使用的参数将其声明移到循环之外.

像这样的东西:

A arr[BIG_NUMBER];

// .... //

for (int i=0; i!=BIG_NUMBER; ++i)
{
    B b = arr[i].getB();
    // ... do some work with b.
}
Run Code Online (Sandbox Code Playgroud)

变成了这个:

A arr[BIG_NUMBER];

// .... //

B b;
for (int i=0; i!=BIG_NUMBER; ++i)
{
    b = arr[i].getB();
    // ... do some work with b.
}
Run Code Online (Sandbox Code Playgroud)

据推测,我们可以节省不断的重新定标b.但这是否合理呢?根据B是原始类型还是类,答案是否有所不同?

我原以为虽然for循环中变量的范围限制可能会阻止它们在循环外被访问,因为循环的内容存在于同一堆栈帧中,"实际"声明只发生一次.

(注意,我考虑在循环中创建一个对象,但认为这是一个不同的问题,因为它与声明而不是初始化相关的任何成本.)

编辑 - 改进标题

c++ optimization scope declaration

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

我负责在QImage :: bits()函数提供的指针上调用delete吗?

Qt类QImage有两个版本的bits()函数,它返回一个指向底层图像数据的指针.一个是const,另一个不是.以下是非const版本的文档:

返回指向第一个像素数据的指针.这相当于scanLine(0).

请注意,QImage使用隐式数据共享.此函数执行共享像素数据的深层副本,从而确保此QImage是唯一使用当前返回值的QImage.

返回类型是uchar*.

这是否意味着delete当我完成它以避免内存泄漏时,我负责调用此指针?

c++ qt memory-leaks qimage

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

在Xcode中调试时如何判断加载了哪些dylib?

我在使用某个特定的库时遇到了一些麻烦,我正在尝试测试旧版本是否能解决我的问题.使用存储在.app文件附近的dylib文件动态链接库.这些dylib文件到处都是,我不完全确定我的应用程序实际上正在使用我试图让它使用的那些.

在visual studio上,您可以在调试应用程序时轻松查看已加载的dll文件列表.Xcode中是否有类似的功能?

xcode dylib dynamic-linking

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

为什么我的地图分配会导致编译错误?

我无法理解为什么这不会编译:

#include <map>
#include <string>

std::map<std::string, std::string> m;
m["jkl"] = "asdf";
Run Code Online (Sandbox Code Playgroud)

我收到此编译器错误:

Line 5: error: expected constructor, destructor, or type conversion before '=' token compilation terminated due to -Wfatal-errors.

我发誓我必须在这里遗漏一些简单的东西.

c++ compiler-errors map

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

为什么我可以使用int构造函数将int绑定到类的引用?

此代码在VS2013和Ideone.com(http://ideone.com/g9P8J7)中编译良好:

#include <list>
#include <iostream>
#include <ostream>

class Foo
{
public:
    Foo(int x_ = -1) : x(x_), y(-2.3f) {}
    int x;
    float y;
};

int main()
{
    std::list<int> myList;
    myList.push_back(0);
    for (auto it = std::begin(myList); it != std::end(myList); ++it)
    {
        Foo const& c = *it;
        std::cout << c.x << ' ' << c.y << std::endl;
        // output: 0 -2.3
    }
}
Run Code Online (Sandbox Code Playgroud)

给定输出,似乎int from myList通过int构造函数隐式转换为Foo实例,然后绑定到引用变量c.但是这个对象住在哪里?如果它是暂时的,为什么它在下一行仍然有效?

c++ reference

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

如何在外部Win32应用程序窗口上添加WPF覆盖?

我试图将WPF窗口作为外部应用程序(如记事本)的子窗口附加以提供叠加.研究了我可以在SO和MSDN上找到的所有答案,当我的WPF应用程序运行时,我已经在记事本的角落创建了一个可靠的叠加层.然而,

  • 一旦记事本获得焦点,叠加层就会消失,
  • 以及在记事本上显示的叠加层,叠加层也单独显示为窗口
  • 记事本上的叠加层不会收到任何MouseMove事件(但单独的窗口会.

以下是演示该问题的最小示例:

Overlay.xaml

<Window x:Class="WindowControlTest.Overlay"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300"
        Opacity="1"
        Background="Azure"
        MouseMove="Window_MouseMove"
        GotFocus="Window_GotFocus"
        Loaded="Window_Loaded"
        Title="Overlay" 
        WindowStyle="None"
        >
</Window>
Run Code Online (Sandbox Code Playgroud)

Overlay.xaml.cs

using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Interop;

namespace WindowControlTest
{

    public partial class Overlay : Window
    {
        IntPtr m_ParentHwnd;
        HwndSource m_HwndSource;

        public Overlay(IntPtr parentHwnd)
        {
            InitializeComponent();
            m_ParentHwnd = parentHwnd;
        }

        private void Window_MouseMove(object sender, MouseEventArgs e)
        {
            Console.WriteLine("Overlay.Window_MouseMove: " + e.GetPosition(this));
        }

        private void Window_GotFocus(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("Overlay.Window_GotFocus");
        }

        private void Window_Loaded(object sender, …
Run Code Online (Sandbox Code Playgroud)

c# windows wpf winapi xaml

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

尝试等待boost :: condition_Variable时,"unique_lock没有互斥锁:操作不允许"错误

我正在尝试使用boost :: wait_condition来休眠一个线程,直到有一些新数据可用.我的功能减少到这个:

bool Node::waitForNewData() const
{
    boost::unique_lock<boost::mutex>(mWasNotifiedMutex);
    mWasNotified = false;
    while (true)
    {
        if (mWasNotified)
            return true;
        if (mThreadIsRequestedToStop)
            return false;
        mWasNotifiedWaitCondition.wait(mWasNotifiedMutex);
    }
}
Run Code Online (Sandbox Code Playgroud)

Boost使用以下消息从wait()函数抛出异常:

boost unique_lock has no mutex: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我正在使用这样的函数来通知等待条件:

void Node::callbackNewDataArrived()
{
    {
        boost::unique_lock<boost::mutex>(mHasNewInletDataMutex);
        mWasNotified = true;
    }
    mWasNotifiedWaitCondition.notify_all();
}
Run Code Online (Sandbox Code Playgroud)

以及标题中的这些声明:

class Node
{
    // ...
    mutable bool mWasNotified;
    mutable boost::mutex mWasNotifiedMutex;
    mutable boost::condition_variable mWasNotifiedWaitCondition;
    std::atomic<bool> mThreadIsRequestedToStop;
};
Run Code Online (Sandbox Code Playgroud)

我在Xcode 4.6.2中构建,在OSX 10.8.5上启用了c ++ 11支持.我的boost库是用它构建的

./b2 toolset=clang cxxflags="-std=c++11 -stdlib=libc++ -arch i386 -arch x86_64" macosx-version=10.6 linkflags="-stdlib=libc++" --prefix=/usr/local …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost boost-thread c++11

0
推荐指数
1
解决办法
2577
查看次数