dtk开发试水(1)

Date:  2017/8/6   Sort:  编程开发 4223 Views / 0 Comments 

  非常有幸接触到深度科技团队基于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 国际许可协议进行许可。

更多