在qt creator中用ui设计器创建了一个QDialog的窗口,添加了一个QWidget部件,怎么能在Qwidget上用QPainter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在qt creator中用ui设计器创建了一个QDialog的窗口,添加了一个QWidget部件,怎么能在Qwidget上用QPainter相关的知识,希望对你有一定的参考价值。

在qt creator中用ui设计器创建了一个QDialog的窗口,添加了一个QWidget部件,怎么能在Qwidget上用QPainter?怎么能让画的图形不出QWidget部件的范围呢?请高手指点

参考技术A 简单点说,要在QWidget上使用QPainter,需要你定义一个继承自QWidget的类,而你现在这么做也只是相当于在窗口中添加了一个QWidget,但这个窗体没有实际的作用。
我写个简单的例子代码,说明怎么用QPainter
widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>
#include <QPainter>

class Widget : public QWidget

Q_OBJECT

public:
Widget(QWidget *parent = 0);
~Widget();

protected:
void paintEvent(QPaintEvent *);
;

#endif // WIDGET_H

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
: QWidget(parent)



Widget::~Widget()



//重新实现paintEvent
void Widget::paintEvent(QPaintEvent *)

QPainter painter(this);
//绘制一行文字
painter.drawText(this->rect(),Qt::AlignCenter,"this is my widget");
本回答被提问者采纳

是否可以让 Qt Creators Ui 设计器为其无法识别的类创建插槽?

【中文标题】是否可以让 Qt Creators Ui 设计器为其无法识别的类创建插槽?【英文标题】:Is it possible to get Qt Creators Ui designer to create slots for a class that it doesn't recognize? 【发布时间】:2012-11-05 16:38:29 【问题描述】:

也就是说,通过右键单击小部件并选择“转到插槽...”来创建插槽。

示例 1,此方法有效:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
;

#endif // MAINWINDOW_H

这不是,因为显然设计者在寻找 Ui::MainWindow* 并且如果找不到它就完全吓坏了(得到“找不到包含'Ui::MainWindow'的类......” )

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <memory>
#include <QMainWindow>

namespace Ui 
class MainWindow;




class MainWindow : public QMainWindow

    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    std::unique_ptr<Ui::MainWindow> ui;
;

#endif // MAINWINDOW_H

我基本上是在寻找一种方法来告诉 Qt“是的,我真的是说那个类。我知道它不包含 Ui::MainWindow*,没关系,一切都会好起来的......”。除非我错了,并且该类出于某种原因实际上需要将其作为普通指针。

【问题讨论】:

Qt 中的 UI 设计器是一个非常原始的工具,它假定您的项目是以标准方式组织的。为什么你需要使用 STL 智能指针,当 Qt 有它自己并且已经被使用时? @divanov 我不需要使用标准智能指针,我想要使用它们。 “Qt 中的 UI 设计器是一个非常原始的工具”——在这种情况下,我希望它是 more 可配置的,而不是更少的。无论如何,QScopedPointer 也会窒息。 UI 设计师的代码关心内存管理,如果你想使用作用域指针,那肯定是有原因的。 @divanov 智能指针强迫症?我正在尝试在我的脑海中刻上“我是 the 所有者,所以它进入一个 unique_ptr”的模式,如果没有令人信服的理由,我宁愿不违反它。当然,破坏我的工具是一个足够令人信服的理由,这就是为什么我要问我是否以及如何让设计师参与进来。 @Cubic,在您提出问题 4 年后,我仍然遇到同样的问题。我想知道是否有人找到了解决方案。 【参考方案1】:

“找不到包含 'Ui::MainWindow' 的类...”当 QT 创建者找不到您的“mainwindow.cpp”文件来放置槽函数定义时,就会出现问题。

确保您的 mainwindow.h 将以下内容作为私有变量:

Ui::MainWindow *ui;

以下包含在您的 mainwindow.cpp 文件中:

#include "ui_mainwindow.h"

如果这不起作用,您的 QT 创建者可能存在错误。尝试更新您的软件。

【讨论】:

就像我在问题中解释的那样,当我使用普通指针而不是 unique_ptr 时,完全相同的代码运行良好。请注意,这是 7 年前的事了,我不确定这是否仍然是当前的行为,因为从那时起 Qt 和 Qt Creator 都发生了很大变化。 尝试更新。我发现过去有错误导致“找不到包含'Ui :: MainWindow'的类......” 我的意思是这个问题来自 7 年前。我现在没有这个问题,因为我已经超过 5 年没有使用 Qt Creator了。

以上是关于在qt creator中用ui设计器创建了一个QDialog的窗口,添加了一个QWidget部件,怎么能在Qwidget上用QPainter的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Qt Creator 的 UI 设计器中的其他两个布局之间删除 Qt 布局?

Qt Creator - 如何查看设计器的代码?

在 Qt Creator Designer 中用自定义模板小部件替换小部件

qt creator 中 ui文件 怎么用编译界面修改?

Qt creator中使用.ui文件的问题

如何通过 qt 设计器创建 QSplitter ui 类?