自定义Qt控件系列-自定义属性和信号(2)

自定义Qt控件系列-自定义属性和信号(2)_第1张图片

这篇文章主要想和大家分享在自定义控件中在designer中的显示问题,以及如何自定义属性和信号。

哈哈,要解决的问题挺多的。让我们一个个来,不着急。

1. 解决在designer中的分组名字和图标

自定义Qt控件系列-自定义属性和信号(2)_第2张图片

这个是我们上一节课的显示出来的。这个分组名字不够大气,图标不能体现个性。

让我们看看customwidget2plugin.cpp里面都有啥内容,或许能找到我们感兴趣的东西。

下面的这段代码就是我们比较感兴趣的了。

// 控件的名字,注意这里的名字必须和class name保持一致
QString CustomWidget2Plugin::name() const
{
    return QLatin1String("CustomWidget2");
}

// 控件分类的名字
QString CustomWidget2Plugin::group() const
{
    return QLatin1String("");
}

// 自定义的icon
QIcon CustomWidget2Plugin::icon() const
{
    return QIcon();
}

我把代码稍微动了动下,最后的显示效果如下

自定义Qt控件系列-自定义属性和信号(2)_第3张图片

QString CustomWidget2Plugin::name() const
{
    return QLatin1String("CustomWidget3");
}

QString CustomWidget2Plugin::group() const
{
    return QLatin1String("Test Custom Widget");
}

QIcon CustomWidget2Plugin::icon() const
{
    return QIcon(":/resource/run.png");
}

后来我发现一个更简单的方法去修改了。不用去修改代码了。请看图,在项目创建的时候就提供了修改的地方了

自定义Qt控件系列-自定义属性和信号(2)_第4张图片

 这个我就介绍到这里了,要想知道更多的细节,就打开那个文件瞅一瞅。

2.自定义控件的属性和信号事件

这次我们动的文件是customwidget2.h和customwidget2.cpp两个文件了。

在customwidget2.h文件

    // 定义一个QString类型,名字叫user(这个user就是现在designer属性栏)
    // 通过user() 方法get到值,通过setUser方法set值,
    // 并同时发出userChanged 信号
    Q_PROPERTY(QString user READ user WRITE setUser NOTIFY userChanged)
    // 类似上面
    Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)
    // 和上面都是类似的,类型为qreal,没有发出信号
    Q_PROPERTY(qreal x READ x WRITE setX)

public:
	QString user() const Q_REQUIRED_RESULT;
    QString password() const Q_REQUIRED_RESULT;
    qreal x() const Q_REQUIRED_RESULT;

    void setX(qreal x);
    void setUser(const QString &user);
    void setPassword(const QString &password);

Q_SIGNALS:
    void userChanged(const QString &user);
    void passwordChanged(const QString &password);

在cpp文件中修改如下:

QString CustomWidget2::user() const Q_REQUIRED_RESULT
{
    return m_strUser;
}

QString CustomWidget2::password() const Q_REQUIRED_RESULT
{
    return m_strPasswd;
}

qreal CustomWidget2::x() const Q_REQUIRED_RESULT
{
    return m_x;
}

void CustomWidget2::setUser(const QString &user)
{
    m_strUser = user;
    emit userChanged(user);
}

void CustomWidget2::setPassword(const QString &password)
{
    m_strPasswd = password;
    emit passwordChanged(password);
}

void CustomWidget2::setX(qreal x)
{
    m_x = x;
}

重新编译,关闭所有的designer,copy dll文件到plugin目录。新建窗口,拖拽Custom控件到窗口上,最终的效果如下。

自定义Qt控件系列-自定义属性和信号(2)_第5张图片

我最想介绍的内容已经结束了。但是我知道大家肯定还有一个疑问,就是我怎么知道属性和信号是那样定义的呢?

嘿嘿,这才是我最想告诉大家的内容。不然,你想自定义一个别的玩意,你可能就无从下手了。

走,我们Qt的源头去看一看,就稍微的咪一眼。Qt的源头在哪里?不就是源码嘛。

我知道很多人有畏惧心理。哎呦,我去,Qt的源码那么大,我看得懂?根本就看不懂啊。

嗯,其实我刚开始也和你想的一样。当我第一次看Qt的源码时候,我也是脑壳疼。实话说我现在也没有看懂Qt的源码,所以我才说稍微的咪一眼就行了。

别怕,就简单的瞅瞅。没啥大不了的,让你去写说不定你也能写出来。

你在安装的Qt的可能有个带源码的选项,说不定你已经安装了。你到安装的Qt目录下去找找看看有没有src目录的。

我这里是特意下载的Qt其中的一个版本的源码,我用vs code直接打开源码目录。我建议你也这么做,因为还是比较方便查看代码的。

下图就是我随意找了一个QLabel.h源码。

 自定义Qt控件系列-自定义属性和信号(2)_第6张图片

看到了没有,我们想要的东西在这里都是有现成的。

这让我想起了侯捷老师说的一句话:“源码面前了无秘密”

好了,下一节课,我们来一个是实战的。综合起来帮助大家深刻理解下。但是大家一定要动手去实践。

你可能感兴趣的:(Qt实战记录,qt,开发语言,自定义插件)