dtk开发试水(2)

Date:  2017/8/19   Sort:  编程开发 51 Views / 0 Comments 

  在上一篇dtk开发学习笔记中,我们尝试了用QtCreator自带的窗口设计工具——QtDesigner来绘制布局,这种操作比较适合刚接触图形界面设计的新手。但是,由于deepin官方并没有提供可用于QtDesigner中可视化开发的动态链接库(.so文件),所以dtkwidget组件库中的控件都只能通过代码来动态创建。这一篇中,我们将把原先的QMainWindow替换成DMainWindow,并借用QtCreator中窗体Ui与运行逻辑分离的方法来设计MainWindow。


  首先新建一个Qt Widgets Application,然后将自动生成的mainwindow.ui(也就是可视化的窗体设计文件)删除,并新建一个头文件mainwindow_ui.h,用于通过代码来配置mainwindow的布局:


#ifndef MAINWINDOW_UI_H
#define MAINWINDOW_UI_H

#include <libdtk-2.0/DWidget/dthememanager.h>
#include <libdtk-2.0/DWidget/DMainWindow>
#include <libdtk-2.0/DWidget/dbasebutton.h>

namespace Ui
{

using namespace Dtk::Widget;

class MainWindow
{
public:
    MainWindow() {}

    DBaseButton *button1;
    QPushButton *button2;

    void setupUi(DMainWindow* mainWindow)
    {
        DThemeManager::instance()->setTheme(mainWindow, "light");
        mainWindow->resize(300,400);

        button1 = new DBaseButton(mainWindow);
        button1->setText("Dtk Base Button");
        button1->setGeometry(20,20,200,100);

        button2 = new QPushButton(mainWindow);
        button2->setText("Qt Push Button");
        button2->setGeometry(20,200,200,100);
    }
};

}
#endif // MAINWINDOW_UI_H


  然后修改mainwindow.cpp,将其中所有的“QMainWindow”改成“DMainWindow”即可。

  最后是mainwindow.h:
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <libdtk-2.0/DWidget/DMainWindow>

using namespace Dtk::Widget;

namespace Ui {
class MainWindow;
}

class MainWindow : public DMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

注意其中的“QMainWindow”也相应地被替换为“DMainWindow”。

这时就可以观察运行结果了。按下F5,看看是否出现了一个包含两个按钮的窗口?它们的样式有何区别? 



  上述代码中,“mainwindow_ui.h”这个文件尤其值得关注。如果你注意观察上一篇中由QtDesigner设计的窗体经过编译后生成的文件,就会发现mainwindow_ui.h里面的代码结构与ui_xxx.h(xxx为具体的类名)类似。事实上,这里采用的正是QtCreator中使用的“设计与逻辑分离”的思路,即将所有不涉及处理事务逻辑的Ui绘制部分从窗体类中分离出来,另立一个类,并且将其包含到统一的命名空间(Ui)中。这种做法的好处与C++开发中常见的PIMPL类似,即力图精简头文件中用户可见的部分,使得那些细节变化(比如微调某个控件的坐标,或者增加/删除一个私有变量)不会影响到这个类对外接口的稳定性,同时也一定程度上避免了函数库开发时的二进制兼容问题。


  在这个ui头文件中,我们创建了两个按钮,并且使用dtk提供的主题管理器将亮色主题(light)应用到窗体。而这些变化,如果仅从mainwindow的主头文件“mainwindow.h”中来看,是看不到的。上一篇中曾提到添加控件时窗体会变成黑色的问题,实际上是由于dtk控件的默认主题是暗色主题(dark),导致使用了dtk控件的窗体也被应用了暗色主题。此外,layout对于动态添加控件也不是必须的,只要在新建空间时指定parent为mainwindow,并且使用raise()方法将其置顶即可。

转载本站文章请注明,转载自:WTZ的小博[ http://wiblog.net/]
知识共享许可协议 本作品采用知识共享署名 4.0 国际许可协议进行许可。

更多