这篇文章主要想和大家分享在自定义控件中在designer中的显示问题,以及如何自定义属性和信号。
哈哈,要解决的问题挺多的。让我们一个个来,不着急。
1. 解决在designer中的分组名字和图标
这个是我们上一节课的显示出来的。这个分组名字不够大气,图标不能体现个性。
让我们看看customwidget2plugin.cpp里面都有啥内容,或许能找到我们感兴趣的东西。
下面的这段代码就是我们比较感兴趣的了。
// 控件的名字,注意这里的名字必须和class name保持一致
QString CustomWidget2Plugin::name() const
{
return QLatin1String("CustomWidget2");
}
// 控件分类的名字
QString CustomWidget2Plugin::group() const
{
return QLatin1String("");
}
// 自定义的icon
QIcon CustomWidget2Plugin::icon() const
{
return QIcon();
}
我把代码稍微动了动下,最后的显示效果如下
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");
}
后来我发现一个更简单的方法去修改了。不用去修改代码了。请看图,在项目创建的时候就提供了修改的地方了
这个我就介绍到这里了,要想知道更多的细节,就打开那个文件瞅一瞅。
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的源头去看一看,就稍微的咪一眼。Qt的源头在哪里?不就是源码嘛。
我知道很多人有畏惧心理。哎呦,我去,Qt的源码那么大,我看得懂?根本就看不懂啊。
嗯,其实我刚开始也和你想的一样。当我第一次看Qt的源码时候,我也是脑壳疼。实话说我现在也没有看懂Qt的源码,所以我才说稍微的咪一眼就行了。
别怕,就简单的瞅瞅。没啥大不了的,让你去写说不定你也能写出来。
你在安装的Qt的可能有个带源码的选项,说不定你已经安装了。你到安装的Qt目录下去找找看看有没有src目录的。
我这里是特意下载的Qt其中的一个版本的源码,我用vs code直接打开源码目录。我建议你也这么做,因为还是比较方便查看代码的。
下图就是我随意找了一个QLabel.h源码。
看到了没有,我们想要的东西在这里都是有现成的。
这让我想起了侯捷老师说的一句话:“源码面前了无秘密”
好了,下一节课,我们来一个是实战的。综合起来帮助大家深刻理解下。但是大家一定要动手去实践。