第一篇文章基本实现了功能,点我查看文章
但是还有一些不完美的地方。
比如
1、有的系统鼠标拖动标题。对话框移动会有问题
2、对话框隐藏再显示,会获取不到焦点。
所以进行了一些优化
TopDialog::TopDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::TopDialog)
{
ui->setupUi(this);
setWindowFlags( Qt::FramelessWindowHint
| Qt::WindowStaysOnTopHint
| Qt::Tool
| Qt::X11BypassWindowManagerHint );//改动点
pLabel = new QLabel(this);
pLabel->setText("信息提交");
pLabel->setAlignment(Qt::AlignVCenter|Qt::AlignHCenter);
pLabel->setStyleSheet("\
background-color:hsl(160,0,240);\
border-top-left-radius:5px;\
border-top-style:solid;border-top-width:1px;border-top-color:rgb(198,198,198);\
border-left-style:solid;border-left-width:1px;border-left-color:rgb(198,198,198);\
border-right-style:solid;border-right-width:1px;border-right-color:rgb(198,198,198);\
border-top-right-radius:5px;\
;");
pLabel->setGeometry(0,0,this->width(),30);
setAttribute(Qt::WA_TranslucentBackground); //设置窗口背景透明
pLabel->installEventFilter(this);
this->setStyleSheet("\
QDialog{\
background-color:rgb(248,248,248);\
border-radius:5px;\
border-style:solid;\
border-width:1px;\
border-color:rgb(198,198,198);\
\
}");
}
TopDialog::~TopDialog()
{
delete ui;
}
bool TopDialog::eventFilter(QObject *obj,QEvent* ev)
{
if(obj == pLabel){
if(ev->type()==QEvent::Type::MouseButtonPress)//判断是否有鼠标点击事件
{
QMouseEvent* e=static_cast<QMouseEvent*> (ev);
if(e->button()==Qt::LeftButton)//判断是否是左键点击
{
pos=e->pos();
return true;//改动点
}
}
else if(ev->type()==QEvent::Type::MouseMove)//判断是否有鼠标移动事件
{
QMouseEvent* e=static_cast<QMouseEvent*> (ev);
if(e->buttons()==Qt::LeftButton)//判断历史点击是否是左键点击
{
int x,y;
x=e->pos().x()-pos.x();
y=e->pos().y()-pos.y();
this->move(this->x()+x,this->y()+y);
return true;//改动点
}
}
}
return QDialog::eventFilter(obj,ev);
}
void TopDialog::paintEvent(QPaintEvent* event)
{
QStyleOption opt;
opt.init(this);
QPainter painter(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
}
void TopDialog::showEvent(QShowEvent* event)
{
setWindowFlags( Qt::FramelessWindowHint
| Qt::WindowStaysOnTopHint
| Qt::Tool
| Qt::X11BypassWindowManagerHint );//改动点
activateWindow();
}
void TopDialog::enterEvent(QEvent* event)
{
setWindowFlags( Qt::FramelessWindowHint
| Qt::WindowStaysOnTopHint
| Qt::Tool
| Qt::X11BypassWindowManagerHint );//改动点
activateWindow();
}