小编lee*_*mes的帖子

QPainter不活跃

以下代码导致一堆错误:

void MainWindow::displayBoard()
{
    QPixmap pix(0,0);
    pix.fill(Qt::white);
    QPainter painter(&pix);
    painter.setBrush(Qt::black);
    for(int row = 0; row < 8; row++)
        for(int col = 0; col < 8; col++)
            painter.drawRect(row * 10, col * 10, 10, 10);
    ui->label->setPixmap(pix);
}
Run Code Online (Sandbox Code Playgroud)

错误:

QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::setBrush: Painter not active
QPainter::drawRects: Painter not active
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

c++ qt qpainter

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

如何避免重复声明Q_DECLARE_METATYPE <aCommonType>

我的项目包含一个链接到两个静态库的应用程序.每个库都声明Q_DECLARE_METATYPE< QUuid >,以便QUuid与之一起使用QVariant,从而导致'redefinition of struct QMetaTypeId< QUuid >'错误.

在保持在不同项目中自己使用每个库的能力的同时,正确的方法是什么?

c++ qt qvariant

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

强制QtCreator在构建时运行"qmake"

在我的一些项目中,我使用.pro文件中配置的一些预构建步骤.因此,qmake无论何时激活,都会执行此步骤.

现在在QtCreator中,当我构建时(也完全重建整个项目时),它并不总是运行qmake,因为它试图变得聪明并优化它.它仅在.pro文件更改时运行它,从而导致多个问题.

另一个常见问题是,当你在该文件上运行qmake 之后创建一个继承自QObject的类时,它不会注意到它,因此不会moc在它上运行.只需qmake通过QtCreator中的"Build"菜单手动运行即可解决此类问题.但是,如果我忘记了这一点,我有时会因为这个而得到编译错误而感到困惑,这真的很烦人.

(如何)我可以强迫QtCreator做到这一步总是建立一个项目是什么时候?

我想在项目配置中添加qmake作为构建步骤,但这似乎是一个解决这个问题的肮脏黑客.

qmake qt-creator

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

"成员是私有的"虽然我在使用尾随返回类型时不从外部访问它

我该如何解决以下问题?

我正在编写一些函数库,它定义了与此问题相关的以下函数:

  • call(f,arg):使用参数调用函数.在某些情况下我只需要一个包装器.
  • comp(f1,f2):返回两个函数的组合.返回一个辅助函子,表示两个函数的组成.

实现如下所示(简化版本仍然证明了问题):

// Call f with one argument
template <class Fn, class Arg>
auto call(const Fn &f, const Arg & arg) -> decltype(f(arg)) {
    return f(arg);
}

// Helper functor for the function below
template<class Fn1, class Fn2>
class CompFn {
    Fn1 a;
    Fn2 b;

public:
    CompFn(const Fn1 &f1, const Fn2 &f2) : a(f1), b(f2) {}

    template<class Arg> inline
    auto operator()(const Arg & arg) const -> decltype(call(b, call(a, arg))) {
        return call(b, call(a, arg));
    } …
Run Code Online (Sandbox Code Playgroud)

c++ templates functional-programming metaprogramming c++11

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

QObject通用信号处理程序

("信号处理程序"是指插槽,而不是POSIX信号的处理程序.)

我需要将来自QObject的一个(尚未知晓的)子类的实例的所有信号 "连接"(可能不QObject::connect直接使用)到另一个QObject的单个插槽.我需要这个以便通过网络发送信号(带参数)(对于支持信号的自己的RPC系统).

("还不知道"我的意思是我的代码应该尽可能通用.所以它不能包含connect我在RPC系统中使用的每个类中的每个信号的语句,但提供类似的东西RPC::connectAllSignals(QObject*);,然后扫描运行期间的所有信号并连接它们.)

我想要实现的是:处理所有信号并将它们串行化(信号名称+参数).我已经可以序列化参数,但我不知道如何获取信号名称.在谷歌搜索之后,似乎不可能像sender()QObject实例那样使用类似的东西.所以我需要做一些更复杂的事情.

我当前用于将参数传递给远程端目标函数的类型系统无论如何都限于某些类型.(那是因为我需要qt_metacall,除了参数类型void*以及它们背后的"正确类型".我的RPC系统在内部使用QVariants只有几种类型,我void*使用自定义方法将它们转换为正确的类型.我听说约QVariant::constData来不及使用它,它可能会不适合呢.所以我会坚持我的类型转换,如果没有缺点)

应将所有信号映射到的目标槽应类似于:

void handleSignal(QByteArray signalName, QVariantList arguments);
Run Code Online (Sandbox Code Playgroud)

最好是C++ 03支持该解决方案,所以我只想使用可变参数模板,如果不使用它们是一个很大的缺点.在这种情况下,C++ 11没问题,所以我对使用C++ 11的答案感到高兴.


现在我可以解决我正在考虑的问题:

我可以使用它扫描对象的所有信号,QMetaObject然后QSignalMapper每个信号创建一个(或类似的,传递所有参数的东西).这很容易,我不需要这方面的帮助.如前所述,我已经限制了一些类型的参数,我也可以对参数计数有限制.

这听起来像是一个肮脏的黑客,但我可以使用某种自定义的,基于模板的信号映射器(在这个例子中有三个参数):

template<class T1, class T2, class T3>
class MySignalMapper : public QObject
{
    Q_OBJECT
public:
    void setSignalName(QByteArray signalName)
    {
        this->signalName = signalName;
    }
signals:
    void mapped(QByteArray signalName, QVariantList arguments);
public slots:
    void …
Run Code Online (Sandbox Code Playgroud)

c++ qt rpc metaprogramming

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

创建QTransform,给定4个点,定义变换后的单位平方

鉴于4分是结果

QPolygon poly = transform.mapToPolygon(QRectF(0, 0, 1, 1));
Run Code Online (Sandbox Code Playgroud)

我该怎么找QTransform transform?(甚至更好:还有一个任意的源矩形)

动机:给定在透视扭曲坐标系中绘制图像的四个角点,如何使用QPainter绘制图像?

问题的插图

这是一个屏幕截图,说明了GIMP中的问题,可以通过围绕图层的4个角移动来转换图层.这导致透视变换.我想在Qt应用程序中做同样的事情.我知道QTransform不仅限于仿射变换,还可以处理透视变换.

math geometry qt perspective coordinate-transformation

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

QGLWidget上的半透明QWidget:奇怪的结果

我有一个全尺寸的QGLWidget,它使用QPainter绘制应用程序背景(将来可能会更改为原生的openGL命令).

在这个QGLWidget之上,我使用QWidgets(非GL)作为用户界面元素.例如,这些是QLineEdits和QPushButtons.我将它们放入一个使用半透明背景画的自定义绘制的QWidget中.QLineEdit和QPushButton的paintEvents也会被覆盖并使用半透明背景.

整个UI 应该如下所示(这是我禁用OpenGL并使用QWidget而不是QGLWidget作为背景的屏幕截图.请注意半透明的顶部栏也绘制阴影(在其自己的区域内)):

截图

当QLineEdit具有焦点时,它应该具有更高的不透明度但仍然不完全不透明:

截图

现在,在启用OpenGL的情况下(背景是QGLWidget),上面的半透明小部件不会在背景上绘制,而是在(似乎是)未初始化的数据上绘制.通过顶栏发光的图像有时是整个窗口本身,有时其他窗口当前在我的桌面上.

目前看起来如下所示(在此屏幕截图中,绘制半透明绘制操作的数据似乎是窗口小部件本身的图像,具有偏移量.):

截图

当我在行编辑中写入文本时(这里:"这是以前曾经存在的一些文本!"),删除它并将焦点设置回背景小部件(因此放大镜图标和占位符文本出现),以前画的东西仍然闪耀(请注意,可见边框不再可见,但仍然可以透过):

截图

所以问题是:半透明小部件不是被绘制在底层小部件之上,而是绘制在旧结果之上,最初类似于"未初始化的内存".

为什么会这样?我该如何解决这个问题?

回答之前你应该知道的事情:

  • 背景场景是在屏幕外渲染的拼贴的组合.因此,它可以非常快速地绘制,并且对于叠加的每一个小变化重新绘制背景都不成问题.
  • 顶部栏是一个自定义QWidget,手动绘制并包含两个小部件(按钮和行编辑).
  • 这两个小部件覆盖了paintEvent,只有当它们具有焦点时才绘制它们自己的(半透明)背景,并且不使用Qt已经提供的帧.因此,第二个屏幕截图中的白色边框是在我的自定义paintEvent中绘制的.
  • 我希望叠加小部件的背景和组成可以单独实现.背景是一个AbstractMapView具有一些具体的地图视图类.整个窗口是一个AbstractView(也有多个具体视​​图),它包含一个具体的地图视图和覆盖小部件,它们以自己决定的方式组成.因此,我不希望覆盖小部件的逻辑成为底层地图视图的一部分.(我希望你理解这一点,因为它有点复杂.)

opengl qt transparency overlay

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

处理键事件Ctrl + Tab和Ctrl + Shift + Tab

我想处理两个关键事件Ctrl+ TabCtrl+ Shift+ Tab,以便在我的应用程序中的选项卡之间切换(分别为"前进"和"后退").但是,这似乎没有按预期工作.

这是我目前的代码(最小例子):

import QtQuick 1.1

Item {
    width: 100
    height: 100

    focus: true

    Keys.onPressed: {
        if(event.modifiers & Qt.ControlModifier) {
            if(event.key === Qt.Key_Tab) {
                if(event.modifiers & Qt.ShiftModifier)
                    console.log('backward')
                else
                    console.log('forward')
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我运行了这段代码qmlviewer(Qt版本4.8.2)

Ctrl+ 时输出Tab:

forward
forward
Run Code Online (Sandbox Code Playgroud)

Ctrl+ Shift+ 时输出Tab:

没有

所以我看到两个错误:前一个键序列被处理两次而另一个根本没有处理.

  • 编辑:解决另一个根本没有得到处理的原因,请参阅评论.

为什么会发生这种情况,我该如何解决?

注意:我已在我的应用程序中使用Qt Components for Desktop,因此如果您知道需要此模块的解决方案,则可以.

qt keyboard-shortcuts event-handling qml

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

OpenGL3.2 GLSL块状插值

我想要一个很好的渐变效果.但是在它真的很零碎的那一刻,你可以看到两个三角形之间的似乎.我有以下着色器vert和frag.我唯一能想到的就是换成预先生成的纹理.

对于两个三角形,数据被浮动为浮点数[xy] [RGB],我不认为C++源是值得展示的.

VERT #version 330

layout(location = 0) in vec2 position;    
layout(location = 1) in vec3 incolor;

smooth out vec3 color;

void main()
{
    color = incolor;
    gl_Position = vec4(position.x,position.y,0.0,1.0);  
}
Run Code Online (Sandbox Code Playgroud)

FRAG #version 330

smooth out vec4 outputColor;
smooth in vec3 color;

void main()
{
    outputColor  = vec4(vec3(color),1.0);   
}
Run Code Online (Sandbox Code Playgroud)

结果 块状

观察单个三角形显示了块状 在此输入图像描述

opengl geometry gradient glsl

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

如何调整2D C++向量的大小?

我有一个2D char矢量:

vector< vector<char> > matrix;
Run Code Online (Sandbox Code Playgroud)

我将在矩阵中读取输入并将其存储在该向量中.我的矢量大小是固定的,是ROW x COL.我想我需要为每一行和每列调整大小.

如何在不占用额外内存(正确调整大小)的情况下完成它?

c++ resize vector

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