做个代码笔记,下次直接复制就用了,不用再找了。我这个记忆力,也记不住几天、、、
1.无边框拖动:
1)设置无边框:
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint); //设置无边框,第一个参数是设置无边框。第二个参数是允许任务栏按钮右键菜单,第三个参数是允许最小化与还原。
2)定义需要的保存状态的变量,在类成员里。
QPoint mousePoint;//记录鼠标位置 bool mousePressed = false;//是否一直按着左键
3)重载三个事件实现无边框拖动:
void *::mouseMoveEvent(QMouseEvent *e)
{//如果是只点击部分区域拖动的话,就在move前判断区域
if (mousePressed && (e->buttons() && Qt::LeftButton))
{
this->move(e->globalPos() - mousePoint);
e->accept();
}
}
void *::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton)
{
mousePressed = true;
mousePoint = e->globalPos() - this->pos();
e->accept();
}
}
void *::mouseReleaseEvent(QMouseEvent * /*e*/)
{
mousePressed = false;
}
其中*是你的类名。
2.无边框窗口阴影:
1)设置最底层的Widget透明显示:
this->setAttribute(Qt::WA_TranslucentBackground); //设置透明
2)拖一个真正布局的Widget放到最底层widget之上,设好位置,留下的缝隙就是窗口的阴影显示的区域。
3)重载paintEvent事件,画出来阴影:
void *::paintEvent(QPaintEvent * /*e*/)
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRect(10, 10, this->width()-20, this->height()-20);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.fillPath(path, QBrush(Qt::white));
QColor color(0, 0, 0, 50);
for(int i=0; iwidth()-(10-i)*2, this->height()-(10-i)*2);
color.setAlpha(150 - qSqrt(i)*50);
painter.setPen(color);
painter.drawPath(path);
}
}
3.Qt递归复制目录:
//Qt复制目录的实现
bool CopyDir(const QDir &fromDir, const QDir &toDir, bool coverFileIfExist)
{
QDir sourceDir = fromDir;
QDir targetDir = toDir;
if(!targetDir.exists())
{ //如果目标目录不存在,则进行创建
if(!targetDir.mkdir(toDir.absolutePath()))
return false;
}
QFileInfoList fileInfoList = sourceDir.entryInfoList();
foreach(QFileInfo fileInfo, fileInfoList)
{
if(fileInfo.fileName() == "." || fileInfo.fileName() == "..")
continue;
if(fileInfo.isDir())
{ //当为目录时,递归的进行copy
if(!CopyDir(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()),coverFileIfExist))
return false;
}
else
{ //当允许覆盖操作时,将旧文件进行删除操作
if(coverFileIfExist && targetDir.exists(fileInfo.fileName()))
{
targetDir.remove(fileInfo.fileName());
}
// 进行文件copy
if(!QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()))){
return false;
}
//文件重命名到新目录,也就是移动文件。应该不支持垮分区的
// if(!QFile::rename(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()))){
// return false;
}
}
}
return true;
}
4.Qt递归删除目录:
//Qt删除目录
bool DeleteDir(const QString & dirName)
{
QDir dir(dirName);
QString tmpdir = "";
if(!dir.exists())
{
return false;
}
QFileInfoList fileInfoList = dir.entryInfoList();
foreach(QFileInfo fileInfo, fileInfoList)
{
if(fileInfo.fileName() == "." || fileInfo.fileName() == "..")
continue;
if(fileInfo.isDir())
{
tmpdir = dirName + ("/") + fileInfo.fileName();
DeleteDir(tmpdir);
dir.rmdir(fileInfo.fileName()); // 移除子目录
}
else if(fileInfo.isFile())
{
dir.remove(fileInfo.fileName()); // 删除临时文件
}
}
dir.cdUp(); // 返回上级目录,因为只有返回上级目录,才可以删除这个目录
if(dir.exists(dirName))
{
if(!dir.rmdir(dirName))
return false;
}
return true;
}
评论已关闭。