dtk开发试水(1)
非常有幸接触到深度科技团队基于Qt5开发的图形界面工具集合——DTK,高效、美观、易上手(至少对于接触过C++编程的人来说如此),是值得国人骄傲的软件产品。虽然deepin系统已经在国际上享有很高的知名度,但是使用dtk开发的图形化界面非官方程序却仍然很少,并且网上也有关dtk的开发教程也较少见。遂决定边填坑边记录,希望能够为dtk在国内的推广做出贡献~
使用QtCreator创建包含dtk控件的程序
为了能直观体验dtk组件的风格,先让一个使用了dtk控件的程序跑起来,代码什么的后面再研究:
1、安装dtk:debian系列中,与dtk 开发相关的文件是 libdtkcore-dev 和 libdtkwidget-dev;其他发行版可类比此名称来查找,可能需要添加第三方源。注意dtk被拆分成两个组件:core和widget,一般这两个组件都需要安装。
2、配置QtCreator:QtCreator的下载和安装就不用我废话了。新建一个Qt Widgets Application,其他参数使用默认值就好。然后打开项目配置文件(就是项目文件列表中第一个文件,后缀名为“.pro”的那个,在它末尾加上:
unix: CONFIG += link_pkgconfig unix: PKGCONFIG += dtkwidget
这是为了使用pkg-config自动解决编译和链接时需要引用的各种头文件和库的路径问题(假定你已经安装了pkgconfig)。当然,你也可以在项目名称上单单击右键,选择“添加库”,然后选择“系统库”并输入“dtkwidget”即可。
或者,如果你只想修改make参数来达到目的的话,就转到“项目”选项卡,在“构建步骤”的“make”项中添加“Make参数”:
`pkg-config --libs dtkwidget`
3、在自动生成的MainWindow.ui中添加一个QPushButton,然后添加一个槽“clicked”,用来触发后续的事件。
4、然后就是MainWindow.cpp中的代码:
#include "mainwindow.h" #include "ui_mainwindow.h" #include "QLayout" #include <libdtk-2.0/DWidget/dbasebutton.h> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { QLayout *l = ui->centralWidget->layout(); if (l == nullptr) { l = new QVBoxLayout; ui->centralWidget->setLayout(l); } Dtk::Widget::DBaseButton *a = new Dtk::Widget::DBaseButton(); a->setText("Dtk Base Button"); QPushButton *b = new QPushButton(); b->setText("Qt Push Button"); l->addWidget(a); l->addWidget(b); } 5、按F5运行,点击窗口中原有的PushButton,看看是否出现了两个新的按钮?它们的样式有何不同?
上述代码中几个重点值得关注:
(1)"#include <libdtk-2.0/DWidget/dbasebutton.h>"
这个是引用dtk中的dwidget中的dbasebutton头文件,用于创建一个DBaseButton(基础按钮)类型的控件。如果在你的发行版中dtk的头文件所在路径不同,请做相应修改(用文件管理器在/usr/include下搜索一下即可找到)。
(2)“Dtk::Widget::DBaseButton *a = new Dtk::Widget::DBaseButton();”
这个是创建一个DBaseButton类的实例。注意,所有dtk控件都被包含于“Dtk”命名空间中的“Widget”命名空间中,也就是一个嵌套的命名空间“Dtk::Widget::”。如果懒得每次都写命名空间,可以在cpp开头加上“using namespace Dtk::Widget;”。
(3)“l->addWidget(a);”
这个是将创建好的DBaseButton添加到之前创建的布局(Layout)中。注意,MainWindow中默认情况下是没有布局的,你需要手动创建一个布局,然后将它分配给MainWindow中的centralWidget。不然没法通过代码来动态添加控件。
注意:由此代码创建的DBaseButton会导致MainWindow原本的背景色变成黑色,即便只是用“new”创建而不添加到Layout中也是如此。推测可能是dtk会自动改写原有的窗体属性。如果要统一控制窗体的属性,需要借用Dtk::Widget中的DMainWindow类。
转载本站文章请注明,转载自:WTZ的小博[ http://wiblog.net/]
本作品采用知识共享署名 4.0 国际许可协议进行许可。