为啥我想在 Qt 小部件上绘制的“矩形”没有出现?

Posted

技术标签:

【中文标题】为啥我想在 Qt 小部件上绘制的“矩形”没有出现?【英文标题】:Why isn't the "rectangle" that I want to draw on my Qt widget showing up?为什么我想在 Qt 小部件上绘制的“矩形”没有出现? 【发布时间】:2012-07-29 22:53:11 【问题描述】:

我基本上想在对话框窗口小部件上显示一个矩形。使用另一个问题作为参考,我尝试调整使用 QLabel 并对其进行绘画的框架(整个过程似乎过于复杂)。

我首先在对话框的类中创建了一个成员:

QLabel* label; 

在对话框的构造函数中:

label = new QLabel(this);
label->setGeometry(20, 50, 50, 100);

只是为了让它工作,我给对话框一个按钮,让用标签创建的“矩形”出现在小部件上。我将此按钮的“按下”信号连接到执行以下操作的插槽:

QPixmap pixmap(50, 100);
pixmap.fill(QColor("transparent"));
QPainter painter(&pixmap);
painter.setBrush(QBrush(Qt::black));
painter.drawRect(20, 50, 50, 100);
label->setPixmap(pixmap);
update(); 

不幸的是,当我按下按钮时,小部件中没有显示任何内容。我在这里想念什么?

【问题讨论】:

【参考方案1】:

我用 PyQt 试过这个,它通常可以工作,但我不能 100% 确定这个过程。或许您应该在致电setPixmap() 之前尝试致电画家painter.end()。另外,我不确定是否应该在QWidget:paintEvent 之外的 QPixmap 上绘制,绘制 QImage 并从中创建 QPixmap 可能更安全。

from PyQt4 import QtGui

app = QtGui.QApplication([])

class Test(QtGui.QWidget):
    def __init__(self):
       QtGui.QWidget.__init__(self)
       self.bn = QtGui.QPushButton("Paint")
       self.lb = QtGui.QLabel()
       layout = QtGui.QVBoxLayout(self)
       layout.addWidget(self.bn)
       layout.addWidget(self.lb)
       self.bn.clicked.connect(self.handleClick)

    def handleClick(self):
       pixmap = QtGui.QPixmap(50, 100)
       pixmap.fill(QtGui.QColor("transparent"))
       p = QtGui.QPainter(pixmap)
       p.drawRect(0,0,50-1,100-1)
       p.end()       
       self.lb.setPixmap(pixmap)

t = Test()
t.show()
app.exec_()

对于简单地绘制一个矩形,这肯定是非常复杂的。我不知道你在计划什么,注意有 QGraphicsView 用于绘制图形。

【讨论】:

以上是关于为啥我想在 Qt 小部件上绘制的“矩形”没有出现?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中的弹出窗口小部件上创建平滑的圆角

剪辑小部件的paintEvent

如何在 Qt-Designer 中使用自定义小部件

在透明的 qt 小部件上画一条线

Qt 如何从 QVector 中的数据创建位图并将其显示在小部件上?

在QOpenGLWidget上使用Qt5小部件而不重写?