DTK常用和測試代碼片

簡 述: DTK 常用和測試代碼片,在 deepin 20uos 20 中,全部使用 DTK 開發,其中有一些是經常遇到的定位 bug 和修改的代碼片。在此拋轉引玉,提交一點開發的貢獻



開發環境:

💻: 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 動態庫文件;/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 中修改測試代碼:

#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 <DSuggestButton>
#include <DTitlebar>
#include <DComboBox>

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();
    ExWidget* exWidget = new ExWidget();
    exWidget->show();

    return app.exec();
}

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

ExWidget::~ExWidget()
{

}

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

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


    //--------------------------------------------------------------
    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);

    //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);


}

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 這個系列的 qt/dtk 學習,附學習由淺入深的目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章