简 述: DTK 常用和测试代码片,在 deepin 20uos 20 中,全部使用 DTK 开发,其中有一些是经常遇到的定位 bug 和修改的代码片。在此抛转引玉,提交一点开发的贡献

[TOC]


本文初发于 “偕臧的小站“,同步转载于此。


开发环境:

  💻: uos 20 📎 deepin 20 📎 gcc/g++ 8.3 📎 gdb8.0


将 dtkwidget 项目注册到系统:

这里以 dtkwidget 为例,它在系统的动态库是存放路径为 /usr/lib/x86_64-linux-gnu/

  • 解答图片:
    经过测试,系统库和 DTK 项目的生成的 libdtkwidget.so 实际使用的都是 最新的 5.xxx 版本,这里面的是 .so.5.1.0;系统库里面遗留下来的 2.xxx 版本可能是提供给某些没有v20版本的项目使用的。
  • 若是想要代码片生效的话,则将项目生成的 .so 文件替代换掉 系统路径下,若是有新的接口改动,那么对应的头文件也要一起替换掉
#【命令: 5.1.0 需要替换为实际的最大】
#[拷贝二进制文件:]
sudo rm -rf /usr/lib/x86_64-linux-gnu/libdtkwidget.so.5.1.0

sudo cp  ../build-dtkwidget-unknown-Debug/src/libdtkwidget.so.5.1.0 /usr/lib/x86_64-linux-gnu/

#[拷贝头文件:]
sudo cp /home/muli/project/dtkwidget/src/widgets/dslider.h /usr/include/libdtk-5.1.0/DWidget/

PS(uos / deepin):

对于 dtkwidget 项目会生成 libdtkwidget.so 动态库;系统存放路径为 /usr/lib/x86_64-linux-gnu/

项目 dtkgui 会生成 libdtkgui.so 动态库文件;系统存放路径为 /usr/lib/x86_64-linux-gnu/

项目 qt5integration 会生成 libchameleon.so 动态库文件在 ./bin/plugins/styles/libchameleon.so 下 ;/usr/lib/x86_64-linux-gnu/qt5/plugins/styles/

sudo rm -rf /usr/lib/x86_64-linux-gnu/qt5/plugins/styles/libchameleon.so
sudo cp  ./bin/plugins/styles/libchameleon.so /usr/lib/x86_64-linux-gnu/qt5/plugins/styles/

判断 系统主题是浅色还是暗色:

DGuiApplicationHelper *guiAppHelp = DGuiApplicationHelper::instance();
if (guiAppHelp->themeType() == DGuiApplicationHelper::ColorType::DarkType) {  //暗色主题

} else {  //浅色主题

}

对某一颜色,在浅 / 暗主题对其亮度进行修改:

//DGuiApplicationHelper::toColorType 获取颜色的明亮度,将其转换为主题类型的枚举值。

QColor lineColor(opt->palette.color(QPalette::Base));
if (DGuiApplicationHelper::toColorType(lineColor) == DGuiApplicationHelper::LightType) {  //此颜色在浅色主题下,亮度 -10
	lineColor = DGuiApplicationHelper::adjustColor(color, 0, 0, -10, 0, 0, 0, 0);
} else {  //此颜色在暗色色主题下,亮度 +10
	lineColor = DGuiApplicationHelper::adjustColor(color, 0, 0, +10, 0, 0, 0, 0);
}

属性的使用:

Q_DECLARE_METATYPE(QMargins)
par->setProperty("_d_margins", QVariant::fromValue(margins));

QMargins magins = par->property("_d_margins").value<QMargins>();
if (par->property("_d_margins").isValid())
	content->setContentsMargins(QMargins(20, 0, 20, 0));
else
	content->setContentsMargins(magins);

在 paintEvent() 里面获取一个颜色:

void SliderStrip::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter pa(this);
    auto dpa = DApplicationHelper::instance()->palette(this);
    QPen penLine = QPen(dpa.textTips(), 1);
    QPen penNumber = QPen(dpa.color(DPalette::ObviousBackground), 1);
    
    pa.set(penLine);
}

将自定义风格 应用于 其他的软件:

qtcreator -style windows

qtcreator -style chameleon

打印 QBoxLayout里面的所有元素:

for (int i = 0; i < d->hBoxLayout->count(); ++i) {
    QLayoutItem *item = (QLayoutItem *)d->hBoxLayout->itemAt(i);
    qDebug()<<i<<item->widget();
}

QT判断鼠标是否在某子窗口控件上方:

需要注意的是,子窗口获取geometry,是相对于父窗口的相对位置,QCursor::pos()获取的是鼠标绝对位置,要不将父窗口的相对位置进行换算,要不将鼠标的绝对位置进行换算,这里本文采用将鼠标绝对位置换算到控件上,示例代码如下:

if(ui->groupBox->geometry().contains(this->mapFromGlobal(QCursor::pos())))

获取项目中的 .svg 图片资源:

case SP_DialogResetButton:
            icon = QIcon::fromTheme(QLatin1String("edit-clear"));

在 main.cpp 中修改测试代码:

qt5integration 的 main.cpp 中, 常用测试代码如下:

#include <QApplication>
#include <QDebug>
#include <QFileInfo>
#include <QDebug>
#include <QTextBrowser>
#include <QWidget>
#include <QAction>
#include <QMenu>
#include <QList>
#include <QPalette>
#include <QPixmap>
#include <QWidget>
#include <DLineEdit>
#include <DPasswordEdit>
#include <DScrollBar>
#include <DListView>
#include <QStandardItemModel>
#include <DStandardItem>
#include <DDialog>

#include <DSuggestButton>
#include <DTitlebar>
#include <DComboBox>
#include <DProgressBar>
#include <QTimer>
#include <QDialog>


DWIDGET_USE_NAMESPACE

class ExWidget : public QWidget
{
public:
    explicit ExWidget();
    ~ExWidget();

    void init();

    void contextMenuEvent(QContextMenuEvent *event);
};

#include "widgetgallery.h"

int main(int argc, char *argv[])
{
    Q_INIT_RESOURCE(styles);

//    qputenv("QT_DEBUG_PLUGINS", "1");
    QStringList paths = QApplication::libraryPaths();
    paths.prepend(QFileInfo(QString::fromUtf8(argv[0])).path() + "/plugins");
    QApplication::setLibraryPaths(paths);

    QApplication app(argc, argv);

//    WidgetGallery gallery;
//    gallery.show();

//    DDialog *dialog = new DDialog("title", "mesg");
//    dialog->show();

    ExWidget* exWidget = new ExWidget();
    exWidget->show();

    return app.exec();
}

ExWidget::ExWidget()
{
    init();
}

ExWidget::~ExWidget()
{

}

void ExWidget::init()
{
    resize(1100, 720);
    setWindowTitle("example DTK");
//    moveToCenter(this);
    setContextMenuPolicy(Qt::DefaultContextMenu);

    //DTitlebar Test--------------------------------------------------------------
    DTitlebar* titleBar = new DTitlebar(this);
    titleBar->setQuitMenuDisabled(false);
    titleBar->move(0, 620);

    //--------------------------------------------------------------
//    QPalette pale = this->palette();
//    pale.setBrush(backgroundRole(),
//                  Qt::white); //纯白
//                  Qt::black); //黑色
//                  QPixmap("/home/muli/softFile/netWallPaper/700047.jpg"));
//                  QPixmap("/home/muli/softFile/netWallPaper/499786.png"));
//                  QPixmap("/home/muli/softFile/netWallPaper/20200326.png"));
//                  QPixmap("/home/muli/Desktop/20200327_104540.png"));
//    setPalette(pale);


    //DListView Test--------------------------------------------------------------
    DListView *listview = new DListView(this);
    QStandardItemModel *model = new QStandardItemModel();
    for (int i= 0; i < 10;i++) {
        DStandardItem *item = new DStandardItem(QString("%1%1%1%1").arg(i));
        model->appendRow(item);
    }
    listview->setModel(model);
    listview->resize(400, 600);
    listview->move(100, 100);
    listview->show();

    //DScrollbar Test--------------------------------------------------------------
//    DScrollBar * scrollbar = new DScrollBar(this);
//    scrollbar->move(50, 50);
////    scrollbar->show();

//    DScrollBar * scrollbar2 = new DScrollBar(this);
//    scrollbar2->setOrientation(Qt::Horizontal);
//    scrollbar2->move(200, 50);
////    scrollbar2->show();

    //DLineEdit Test--------------------------------------------------------------
//    DLineEdit* lineEdit = new DLineEdit(this);
//    lineEdit->resize(300, 40);
//    lineEdit->setEchoMode(QLineEdit::Password);
//    lineEdit->move(50, 40);

//    DPasswordEdit* passEdit = new DPasswordEdit(this);
//    passEdit->resize(300, 40);
//    passEdit->move(50, 100);

//    QLineEdit* edit = new QLineEdit(this);
//    edit->resize(300, 40);
//    edit->move(50, 150);
//    edit->setEchoMode(QLineEdit::Password);

    //DComboBox Test--------------------------------------------------------------
//    DComboBox* combobox = new DComboBox(this);
//    combobox->resize(300, 40);
//    combobox->addItem(QIcon::fromTheme("edit"), "test 01");
//    combobox->addItem(QIcon::fromTheme("button_add"), "test 02");
//    combobox->addItem(QIcon::fromTheme("edit"), "test 03");
//    combobox->addItem(QIcon::fromTheme("edit"), "test 04");
//    combobox->move(50, 200);

    //DPushButton Test--------------------------------------------------------------
//    btn = new DPushButton("this", this);
//    btn->resize(300, 50);
//    btn->move(50, 50);
//    btn->setGeometry(50,05,300,50);

//    btn2 = new DPushButton("this a", this);
//    btn2->resize(300, 50);
//    btn2->move(360, 50);

//    frame = new DFrame(this);
//    frame->resize(300, 50);
//    frame->move(50, 110);
////    DStyle::setFrameRadius(frame, 16);
//    frame->setStyleSheet("font: bold; font-size:20px; color: rgb(241, 70, 62)");
//    frame->setFrameRounded(true);

//    qDebug()<<"--01--"<<frame->rect();


//DProgressBar Test--------------------------------------------------------------

//    int nStar = 50;
//    DProgressBar *proBar1 = new DProgressBar(this);
//    proBar1->setOrientation(Qt::Horizontal);
//    proBar1->move(50, 50);
//    proBar1->resize(300, 50);
//    proBar1->setRange(0, 100);
//    proBar1->setValue(nStar);
////    proBar1->setAlignment(Qt::AlignCenter);
//    proBar1->show();

//    DProgressBar *proBar2 = new DProgressBar(this);
//    proBar2->setOrientation(Qt::Vertical);
//    proBar2->move(400, 50);
//    proBar2->resize(50, 300);
//    proBar2->setRange(0, 100);
//    proBar2->setValue(nStar);
//    proBar2->show();

//    DProgressBar *proBar3 = new DProgressBar(this);
//    proBar3->setOrientation(Qt::Horizontal);
//    proBar3->move(50, 200);
//    proBar3->resize(300, 8);
//    proBar3->setRange(0, 100);
//    proBar3->setValue(nStar);
////    proBar3->setAlignment(Qt::AlignCenter);
//    proBar3->show();

//    DProgressBar *proBar4 = new DProgressBar(this);
//    proBar4->setOrientation(Qt::Vertical);
//    proBar4->move(500, 50);
//    proBar4->resize(8, 300);
//    proBar4->setRange(0, 100);
//    proBar4->setValue(nStar);
//    proBar4->show();


//    QTimer *timer = new QTimer(this);
//    timer->start();
//    timer->setInterval(50);

//    connect(timer, &QTimer::timeout, [=](){
//        if (proBar1->value() >= 100)
//            proBar1->setValue(0);
//        proBar1->setValue(proBar1->value() + 1);

//        if (proBar2->value() >= 100)
//            proBar2->setValue(0);
//        proBar2->setValue(proBar2->value() + 1);

//        if (proBar3->value() >= 100)
//            proBar3->setValue(0);
//        proBar3->setValue(proBar3->value() + 1);

//        if (proBar4->value() >= 100)
//            proBar4->setValue(0);
//        proBar4->setValue(proBar4->value() + 1);
//        });

}

void ExWidget::contextMenuEvent(QContextMenuEvent *event)
{
    Q_UNUSED(event)

    QMenu* menu = new QMenu(this);
    for (int i = 0; i < 50; ++i) {
        QString str = QString("act   %1").arg(i);
        menu->addAction(str);
        menu->addSeparator();
    }
    menu->exec(QCursor::pos());
}

下载地址:

QtExamples

欢迎 star 和 fork 这个系列的 linux 学习,附学习由浅入深的目录。