简 述: DTK
常用和测试代码片,在 deepin 20
或 uos 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());
}
下载地址:
欢迎 star 和 fork 这个系列的 linux 学习,附学习由浅入深的目录。