【Qt】常用小功能实现
QLabel设置背景透明
label->setStyleSheet("QLabel {background-color: transparent;}");
Qt加载GIF图
示例代码
QLabel* label = new QLabel();
label->resize(100, 100);
label->setStyleSheet("background:#000000;"); //黑底,可以对比明显一点。
QMovie* movie = new QMovie(":/resource/loading/loading.gif");
label->setMovie(movie);
movie->start();
label->show();
给定svg
图片,转化为QPixmap
QPixmap GetPixmapFromSvgPath(const QString& svgPath, QSize size)
{
QSvgRenderer svg_render(svgPath);
QPixmap pixmap(size);
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
svg_render.render(&painter);
return pixmap;
}
给定svg
图片,转化为QIcon
QIcon GetIconFromSvgPath(const QString& svgPath, QSize size)
{
QSvgRenderer svg_render(svgPath);
QPixmap pixmap(size);
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
svg_render.render(&painter);
QIcon ico(pixmap);
return ico;
}
Qt弹出灰色半透明的子窗口,使子窗口上也按不了
QWidget* widget = new QWidget(this, Qt::FramelessWindowHint);
widget->resize(this->size());
widget->setStyleSheet("QWidget{background-color:rgba(10,10,10,100);}"); //设置原来的主界面为灰色,通过覆盖原来,展示透明度实现。
widget->show();
Qt实现登录加载GIF效果,登录时原来窗口灰色处理
QLabel* label = new QLabel(this, Qt::FramelessWindowHint); // 阻塞原来界面
label->resize(this->size());
label->setStyleSheet("QWidget{background-color:rgba(10,10,10,100);}"); //设置原来的主界面为灰色,通过覆盖原来,展示透明度实现。
QMovie* movie = new QMovie(":/resource/loading/loading.gif");
movie->setScaledSize(label->size() / 2); //设置gif大小
label->setMovie(movie);
label->setAlignment(Qt::AlignCenter); // gif居中
movie->start();
label->show();
Qt清空QListWidget
项,不清理自定义QWidget
while (ui->listWidget_items->count() > 0) {
auto item = ui->listWidget_items->takeItem(0);
delete item;
}
QPainter绘制边框
QPainter painter(this);
QPen pen;
pen.setColor(Qt::darkGray);
pen.setWidth(2); // 画笔宽度
painter.setPen(pen);
painter.drawRect(this->rect());
painter.end();
QLineEdit自定义右键菜单栏选项
// 1. 设置QLineEdit的属性,右键时展示自定义的QAction
lineEdit->setContextMenuPolicy(Qt::ActionsContextMenu);
// 2. 添加自定义QAction
QAction* action= new QAction("xxxxx.png");
lineEdit->addAction(action);
Qt拷贝内容到粘贴板,或从粘贴板获取内容
QString source = ui->textEdit_code->toPlainText(); // 要拷贝的内容
QClipboard *clipboard = QApplication::clipboard(); //获取系统剪贴板指针
QString originalText = clipboard->text(); //获取剪贴板上文本信息
clipboard->setText(source);
Qt自定义实现无边框窗口,以及自定义最大化、最小化和关闭按钮 等功能的一个思路
找到了一个博主博客,实现的思路非常好,通过三层QWidget
实现:Qt实战6.万能的无边框窗口(FramelessWindow) - Qt小罗 - 博客园 (cnblogs.com)
Qt无边框拖动
有个参考博客:(18条消息) QT 实现无边框拖动_lwwl12的博客-CSDN博客_qt无边框窗口拖动
里面是设置无边框Qt::FramelessWindowHint
之后,通过重写三个函数mouseReleaseEvent
、mousePressEvent
和mouseMoveEvent
,实现跟随鼠标拖动的效果。
Qt中QProgressBar设置进度条颜色
proBar = new QProgressBar(this);
proBar->setStyleSheet("QProgressBar{background:white;} QProgressBar::chunk{background:blue}");
QProgressBar初始自带滚动效果
ui->progressBar_download->setMaximum(0); // 通过设置最大为0,可以实现滑动框滚动的动画效果。
QTreeWidget中QTreeWidgetItem前添加复选框
参考:[QTreeWidget中的复选框使用 - 辉常的D调 - 博客园 (cnblogs.com)](https://www.cnblogs.com/doubleeleven/articles/3894250.html#:~:text=QTreeWidget中的复选框使用 在树形结构中有时候需要在每项前添加复选框,能够进行勾选,复选框的添加可以使用tree本身的属性就行 voidQTreeWidgetItem%3A%3AsetCheckState (,intcolumn%2C Qt%3A%3ACheckState state ))
QTreeWidgetItem* item = new QTreeWidgetItem(widget);
item->setCheckState(0, Qt::CheckState::Unchecked);//设置复选框
当点击复选框时,QTreeWidget
会发射信号itemClicked
和itemChanged
信号,这里我们使用itemClicked
信号,而不能使用itemChanged
。
因为itemChanged
,当我们在改变项目复选框时,也会回调,这样循环回调,容易出问题。
void itemClicked(QTreeWidgetItem* item, int column);