簡 述: DTK
常用和測試代碼片,在 deepin 20
或 uos 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());
}
下載地址:
歡迎 star 和 fork 這個系列的 qt/dtk 學習,附學習由淺入深的目錄。