小编lee*_*mes的帖子

Q_FOREACH(= foreach)宏如何工作以及为什么这么复杂?

在Qt中,有一个foreach使用宏(Q_FOREACH)实现的循环.根据编译器的不同,有不同的实现.

海湾合作委员会的定义如下:

#define Q_FOREACH(variable, container)                                \
for (QForeachContainer<__typeof__(container)> _container_(container); \
     !_container_.brk && _container_.i != _container_.e;              \
     __extension__  ({ ++_container_.brk; ++_container_.i; }))        \
    for (variable = *_container_.i;; __extension__ ({--_container_.brk; break;}))
Run Code Online (Sandbox Code Playgroud)

...使用QForeachContainer如下定义的辅助类:

template <typename T>
class QForeachContainer {
public:
    inline QForeachContainer(const T& t) : c(t), brk(0), i(c.begin()), e(c.end()) { }
    const T c;
    int brk;
    typename T::const_iterator i, e;
};
Run Code Online (Sandbox Code Playgroud)

在容器Q_FOREACH宏必须是一类T至少必须提供T::const_iterator类型,T.begin()和一个T.end()方法,像所有的STL容器以及最Qt的容器,如QList,QVector, …

c++ macros foreach qt

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

允许"朋友"类仅访问某些私有成员

假设我有三个C++类FooA,FooB和FooC.

FooA有一个名为的成员函数Hello,我想在类FooB中调用这个函数,但我不希望类FooC能够调用它.我能想出来实现这一点的最好方法是将FooB声明为FooA的朋友类.但只要我这样做,所有 FooA的私人和受保护成员都将被曝光,这对我来说是非常不可接受的.

所以,我想知道C++(03或11)中是否有任何机制比friend类可以解决这个难题更好.

我认为如果可以使用以下语法会很好:

class FooA
{
private friend class FooB:
    void Hello();
    void Hello2();
private:
    void Hello3();
    int m_iData;
};

class FooB
{
    void fun()
    {
        FooA objA;
        objA.Hello()  // right
        objA.Hello2() // right
        objA.Hello3() // compile error
        ojbA.m_iData = 0; // compile error
    }
};

class FooC
{
    void fun()
    {
        FooA objA;
        objA.Hello()  // compile error
        objA.Hello2() // compile error
        objA.Hello3() // compile error
        ojbA.m_iData = 0; // compile error
    } …
Run Code Online (Sandbox Code Playgroud)

c++ friend

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

我如何从另一个班级发出信号?

我的Qt应用程序有问题.我正试图从另一个类中发出一个信号(它是放置信号的嵌套类).

我已经将信号连接到一个插槽,应该没问题.但是当我尝试从这个嵌套类中发出这个信号时,我得到编译器错误:

没有对象就无法调用成员函数

怎么了?我在Qt文档中找到了它,但找不到合理的解决方案甚至解释.

简化的类定义如下所示.

class LogWriter : public QDialog
{   
   Q_OBJECT

public:
   class Log : public QObject
   {
      Q_OBJECT

   public:
      bool print;

      Log(bool _print, QString _color, QObject *obj = NULL)
         : QObject(obj)
      {
         print = _print;
         color = _color;
      }
   };

   LogWriter(QWidget * parent = 0);
   ~LogWriter();

public slots:
   void setMinVal();
   void setMediumVal();
   void setHighVal();
   void cleanWindow();
   void appendText(QString &text);

signals:
   void signalLogAppend(QString);
};
Run Code Online (Sandbox Code Playgroud)

LOW使用以下函数调用将客户端代码中LogWriter 实例的信号连接到某个插槽:

connect(&LOW, SIGNAL(signalLogAppend(QString)),
        this, SLOT(appendText(QString&)),
        Qt::DirectConnection);
Run Code Online (Sandbox Code Playgroud)

c++ qt qt4 signals-slots

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

查看使用pip安装/更新软件包的时间

我知道如何使用pip查看已安装的Python包,只需使用pip freeze.但有没有办法看到使用pip安装或更新软件包的日期和时间?

python pip

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

如何在QML中使用子占位符定义"模板"?

我真的很喜欢QML.我喜欢如何定义组件(与类相比)及其属性,并从其他地方(与对象相比)实例化它们.

我可以说,一个按钮,有一些外观和感觉,上面有标签文字.例如,可以使用此组件定义(Button.qml)来完成此操作:

Item {
    id: button
    property string label

    anchors.fill: parent

    Rectangle {
        anchors.fill: parent
        radius: 10
        color: "gray"

        Text {
            anchors.centerIn: parent
            font.pixelSize: 20
            text: button.label
            color: "white"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并在此主文件(main.qml)中实例化:

Rectangle {
    width: 300
    height: 200

    Button {
        anchors.centerIn: parent
        anchors.margins: 50
        label: "Hello button!"
    }
}
Run Code Online (Sandbox Code Playgroud)

但我看到以下限制:我只能定义一个带有一些属性的按钮模板,而不是一些占位符.实例中定义的所有子项都是直接子项,至少是默认值,我想更改此行为.

假设我想在按钮中放置一个项目(让我们说一个图像,但我不想告诉Button它将是一个图像的定义).我想象这样的事情:

Item {
    id: button
    property Item contents   <-- the client can set the placeholder content here

    anchors.fill: parent …
Run Code Online (Sandbox Code Playgroud)

qt qml qt-quick

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

如何在C++ 11中使用lambda auto参数

我有一个C++ 14代码.但是,当我在C++ 11中使用它时,它有一个错误const auto.如何在C++ 11中使用它?

vector<vector <int> > P;  
std::vector<double> f;
vector< pair<double, vector<int> > > X; 
for (int i=0;i<N;i++)
        X.push_back(make_pair(f[i],P[i]));

////Sorting fitness descending order
stable_sort(X.rbegin(), X.rend());
std::stable_sort(X.rbegin(), X.rend(),
                [](const auto&lhs, const auto& rhs) { return lhs.first < rhs.first; });
Run Code Online (Sandbox Code Playgroud)

c++ auto c++11

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

正确无损地转换为std :: string和QByteArray的方法

在std :: string和QByteArray之间无损转换的正确方法是什么...主要是为了处理二进制数据?

我正在使用:

QByteArray qba = QString::fromStdString(stdString).toAscii();
Run Code Online (Sandbox Code Playgroud)

QString(qba).toStdString();
Run Code Online (Sandbox Code Playgroud)

但我想检查一下这是否正确.

c++ string binary qt

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

__func__外部函数定义

如果我们__func__在C(C99/C11)和C++中的函数外部使用预定义变量会发生什么?

#include <stdio.h>

const char* str = __func__;

int main(void)
{
   printf("%s", str);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc 4.7.2只发出警告(-Wall -W -pedantic启用)并且不打印任何内容.

标准没有明确说明任何事情:

ISO/IEC 14882:2011

8.4.1一般[dcl.fct.def.general]

8函数本地预定义变量__func__定义为static const char __func__[] = "function-name"; 已提供表单定义,其中function-name是实现定义的字符串.未指定此变量的地址是否与程序中任何其他对象的地址不同.

ISO/IEC 9899:2011

6.4.2.2预定义标识符

1标识符__func__应由翻译者隐式声明,如同紧接在每个函数定义的左大括号之后,声明static const char __func__[] = "function-name"; 出现,其中function-name是词法封闭函数的名称.

UB?错误?或者是其他东西?

c c++ c99 c++11 c11

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

STL算法:为什么没有容器的附加接口(除了迭代器对)?

我想知道为什么STL不会重载它们的算法函数,这样我就可以通过简单地提供一个容器而不是采用更冗长的方式来传递begin + end迭代器来调用它们.我当然理解为什么我们也想使用迭代器对来处理容器/数组的子序列,但是,几乎所有对这些方法的调用都使用整个容器:

std::for_each(myVector.begin(), myVector.end(), doSomething);
Run Code Online (Sandbox Code Playgroud)

我发现它只是更方便,可读和可维护

std::for_each(myVector, doSomething);
Run Code Online (Sandbox Code Playgroud)

有没有理由STL不提供这些重载?[编辑:我的意思并不是要取代这个接口的限制之一,但要提供了基于容器的iterface!]难道他们介绍歧义?我在考虑这样的事情:

template<typename _Container, typename _Funct>
inline _Funct for_each(_Container c, _Funct f) {
    return for_each(begin(c), end(c), f);
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

c++ stl overloading stl-algorithm c++11

17
推荐指数
2
解决办法
1843
查看次数

在Qt中删除文件名的扩展名

我正在使用Qt从用户那里获取文件名:

QString fileName = QFileDialog::getOpenFileName(this,tr("Select an image file"),"d:\\",tr("Image files(*.tiff *.tif )"));
Run Code Online (Sandbox Code Playgroud)

它工作,但我需要文件名没有它的扩展名,是否有可能在Qt?当我尝试:

QString f = QFileInfo(fileName).fileName();
Run Code Online (Sandbox Code Playgroud)

f就像 "filename.tif",但我希望它是"文件名".

c++ qt

17
推荐指数
3
解决办法
3万
查看次数

标签 统计

c++ ×8

qt ×5

c++11 ×3

auto ×1

binary ×1

c ×1

c11 ×1

c99 ×1

foreach ×1

friend ×1

macros ×1

overloading ×1

pip ×1

python ×1

qml ×1

qt-quick ×1

qt4 ×1

signals-slots ×1

stl ×1

stl-algorithm ×1

string ×1