Qt代码:QPainter painter(this);this指针是QWidget,报错参数不完整,是什么原因?
时间: 2023-03-15 21:56:38 浏览: 377
这是因为QPainter的构造函数需要两个参数,第一个参数是指向QPaintDevice的指针,而第二个参数是可选的指向 QWidget 的指针。因为只提供了一个指向QWidget的指针,所以出现了参数不完整的错误。
相关问题
QT:将painter绘制的表盘和slider连接起来
要将`QPainter`绘制的表盘和`QSlider`连接起来,可以使用`QAbstractSlider`类的`valueChanged()`信号。当`QSlider`的值发生变化时,会发出`valueChanged()`信号,我们可以在该信号的槽函数中重新绘制表盘。
以下是一个使用`QPainter`和`QSlider`实现表盘显示和控制的示例:
```cpp
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
private slots:
void onSliderValueChanged(int value);
private:
QSlider *m_slider;
int m_value;
};
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
// 创建一个QSlider对象
m_slider = new QSlider(Qt::Horizontal, this);
m_slider->setRange(0, 100);
// 连接QSlider的valueChanged()信号到槽函数onSliderValueChanged()
connect(m_slider, &QSlider::valueChanged, this, &MyWidget::onSliderValueChanged);
// 初始化表盘的值
m_value = 0;
}
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 绘制表盘
painter.drawEllipse(50, 50, 200, 200);
painter.drawLine(150, 150, 150 + 80 * qCos((m_value - 90) * M_PI / 180), 150 + 80 * qSin((m_value - 90) * M_PI / 180));
}
void MyWidget::onSliderValueChanged(int value)
{
m_value = value;
// 重新绘制表盘
update();
}
```
在上面的示例中,我们首先创建了一个`QSlider`对象,然后将其连接到`valueChanged()`信号的槽函数`onSliderValueChanged()`中。在`paintEvent()`函数中,我们使用`QPainter`对象绘制了一个表盘,并根据`m_value`的值绘制了一个指针。在`onSliderValueChanged()`函数中,我们将`m_value`的值设置为`QSlider`的当前值,并调用`update()`函数重新绘制表盘。
这样,当我们拖动`QSlider`时,表盘上的指针会随之移动。
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override { if (index.column() == 0) { QTreeWidget* treeWidget = qobject_cast<QTreeWidget*>(index.data(Qt::UserRole).value<void*>()); if (treeWidget) { painter->save(); // 设置绘制区域 QRect rect = option.rect.adjusted(2, 2, -2, -2); painter->setClipRect(rect); painter->translate(rect.topLeft()); // 绘制树形控件 treeWidget->resize(rect.size()); treeWidget->render(painter, QPoint(), QRegion(), QWidget::DrawChildren); painter->restore(); return; } } QStyledItemDelegate::paint(painter, option, index); }
这段代码是一个自定义的委托类的 `paint` 函数,用于在 `QTableWidget` 控件中第一列绘制嵌套的 `QTreeWidget` 控件。
在该函数中,首先判断当前绘制的是第一列,并尝试将 `Qt::UserRole` 角色的数据转换成 `QTreeWidget` 类型的指针,如果转换成功则说明当前单元格需要绘制 `QTreeWidget`,接下来就可以绘制 `QTreeWidget` 控件了。
如果转换失败,则说明当前单元格不需要绘制 `QTreeWidget` 控件,直接调用基类的 `QStyledItemDelegate::paint` 函数进行绘制即可。
需要注意的是,该委托类的 `paint` 函数中使用了 `qobject_cast` 函数进行类型转换,因此需要在类定义中使用 `Q_OBJECT` 宏进行声明,否则会导致转换失败。
阅读全文