• 10695阅读
  • 24回复

[提问]Qt 设置无边框/可移动窗口 如何添加黑色边线 [复制链接]

上一主题 下一主题
离线xuxb
 
只看楼主 倒序阅读 楼主  发表于: 2012-12-01
我现在写了一个无边框的可移动的窗口,也加了背景图片,但是我不知道如何给这个窗口四周(上/下/左/右)加上边线(黑色实线)
请高手指点??我设置了如下代码:但是没有效果
QString str = "QFrame#"+objectName+"{border-image:url("+path+");border:1px solid black}";
setStyleSheet(str);
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 1楼 发表于: 2012-12-01
顶一下
承接C/C++ MFC Qt  网络通信等项目!!!
离线jdwx

只看该作者 2楼 发表于: 2012-12-02
回 1楼(xuxb) 的帖子
3方案:
1:找个有边框的图片做背景
2:自己 paint边框。
3:里面放个QFrame,推荐。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线xuxb
只看该作者 3楼 发表于: 2012-12-03
Re:回 1楼(xuxb) 的帖子
引用第2楼jdwx于2012-12-02 09:06发表的 回 1楼(xuxb) 的帖子 :
3方案:
1:找个有边框的图片做背景
2:自己 paint边框。
3:里面放个QFrame,推荐。

  如何paint 边框
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 4楼 发表于: 2012-12-03
Re:回 1楼(xuxb) 的帖子
引用第2楼jdwx于2012-12-02 09:06发表的 回 1楼(xuxb) 的帖子 :
3方案:
1:找个有边框的图片做背景
2:自己 paint边框。
3:里面放个QFrame,推荐。

我里面就是用的QFrame啊  请问如何设置
承接C/C++ MFC Qt  网络通信等项目!!!
离线shiziyang

只看该作者 5楼 发表于: 2012-12-03
换图片最方便,border和border-image一起用貌似会变形的,最好不要一起用
离线xuxb
只看该作者 6楼 发表于: 2012-12-03
问题是我不想换图片  因为以后做ui不能总是因为不能实现预期的效果,就换图片啊
承接C/C++ MFC Qt  网络通信等项目!!!
离线shiziyang

只看该作者 7楼 发表于: 2012-12-03
那就不要用qss,在paintevent里自己画吧先drawPixmap把图画上去,然后在用画线和画弧的接口画边框
离线xuxb
只看该作者 8楼 发表于: 2012-12-04
引用第7楼shiziyang于2012-12-03 14:14发表的  :
那就不要用qss,在paintevent里自己画吧先drawPixmap把图画上去,然后在用画线和画弧的接口画边框


能说在详细下吗??本人是菜鸟 能不能举个例子
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 9楼 发表于: 2012-12-04

void QMyDialog::paintEvent(QPaintEvent *event)
{
  //生成一张位图
  QBitmap objBitmap(size());
  //QPainter用于在位图上绘画
  QPainter painter(&objBitmap);
  //填充位图矩形框(用白色填充)
  painter.fillRect(rect(),Qt::white);
  painter.setBrush(QColor(0,0,0));
  //在位图上画圆角矩形(用黑色填充)
  painter.drawRoundedRect(this->rect(),5,5);
  
  //画边框 没有效果啊 不是红色
  painter.setPen(Qt::red);
  painter.drawLine(this->rect().topLeft(),this->rect().topRight());
  //使用setmask过滤即可
  setMask(objBitmap);

  //主窗口缩放最小值
  setMinimumSize(m_MinWidth,m_MinHeight);
}
承接C/C++ MFC Qt  网络通信等项目!!!
离线shiziyang

只看该作者 10楼 发表于: 2012-12-04
回 9楼(xuxb) 的帖子
bitmap里边框也没有,你还要把bitmap画到窗体上
QPainter painter(this);
然后
painter.drawImage或painter.drawPixmap
所以你这里也不要用QBitmap,用QPixmap好了
离线xuxb
只看该作者 11楼 发表于: 2012-12-04
QPainter painter(this);
painter.drawPixmap(rect(),QPixmap(":/images/frame.jpg"));
painter.setPen(QColor(0,0,0));
painter.drawRoundedRect(this->rect(),5,5);

这样写了出现 两个意外情况,1> 边角不是不是圆角  2>右边和下边  没有边框啊
如下图
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 12楼 发表于: 2012-12-04
承接C/C++ MFC Qt  网络通信等项目!!!
离线shiziyang

只看该作者 13楼 发表于: 2012-12-04
圆角效果还是要通过setMask来设置的。右边和下边显示不出大概是因为超出了,你的框的宽度和高度需要减2的,因为笔默认也有一个像素,你把rect的宽高一点点减下来看看
离线xuxb
只看该作者 14楼 发表于: 2012-12-04
十分感谢!!但是我还是有点不明白!
1.setMask参数只能是bitmap 如果我改过来后就没有显示图片
2.上面提到的rect指的是框架吗??
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 15楼 发表于: 2012-12-04
QPainter painter(this);
//x,y坐标加1 宽度和高度 减1 这样就使得框的四周都保留出1像素的
//可是还是没有右边和下边的边框的
painter.drawPixmap(rect().x()+1,rect().y()+1,rect().width()-1,rect().height()-1,
                                     QPixmap(":/images/frame.jpg"));
painter.setPen(Qt::red);
painter.drawRoundedRect(this->rect(),5,5);
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 16楼 发表于: 2012-12-04
还是楼上的 大神 在指点一下吧
并且四角如何设置是圆角的
小弟不胜感激
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 17楼 发表于: 2012-12-04
引用第15楼xuxb于2012-12-04 14:00发表的  :
QPainter painter(this);
//减2后 出现白色边框 仍不是红色
painter.drawPixmap(rect().x(),rect().y(),rect().width()-2,rect().height()-2,
                                     QPixmap(":/images/frame.jpg"));


承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 18楼 发表于: 2012-12-04
边框解决了 我是这样解决的 但是四角还不是圆角
QPainter p(this);
QPixmap img(":/images/frame.jpg");
p.setBrush(QBrush(img));
p.setPen(QColor(0,0,0));
p.drawRoundedRect(0,0,width() - 1,height() - 1, 5, 5);
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 19楼 发表于: 2012-12-04
请这个 shiziyang 哥们帮忙一下吧
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 20楼 发表于: 2012-12-04
解决了 我设置了下属性
setAttribute(Qt::WA_TranslucentBackground, true);
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 21楼 发表于: 2012-12-04
谢谢楼上的指点啊
承接C/C++ MFC Qt  网络通信等项目!!!
离线shiziyang

只看该作者 22楼 发表于: 2012-12-04
设置4个角圆角可以使用void QWidget::setMask ( const QRegion & region )
或者QBitmap QPixmap::mask () const可以得到QPixmap的mask给setMask用
离线xuxb
只看该作者 23楼 发表于: 2012-12-05
引用第22楼shiziyang于2012-12-04 14:22发表的  :
设置4个角圆角可以使用void QWidget::setMask ( const QRegion & region )
或者QBitmap QPixmap::mask () const可以得到QPixmap的mask给setMask用

但是我是这样写的  可是还是不行啊
void QBaseFrame::paintEvent(QPaintEvent *event)
{  
  QPainter painter(this);
  QPixmap img(":/images/frame.jpg");
  painter.setBrush(QBrush(img));
  painter.setPen(QColor(0,0,0));
  painter.drawRoundedRect(0,0,width() - 1,height() - 1, 5, 5);
  setMask(img.mask());//按照你说的 还是不行
  //主窗口缩放最小值
  setMinimumSize(m_MinWidth,m_MinHeight);
}
承接C/C++ MFC Qt  网络通信等项目!!!
离线xuxb
只看该作者 24楼 发表于: 2012-12-05
setAttribute(Qt::WA_TranslucentBackground, true); 通过设置这个虽然可以达到 有颜色的边框但是它有副作用 就是最小化窗口的时候 焦点一直在最小化按钮
承接C/C++ MFC Qt  网络通信等项目!!!
快速回复
限100 字节
 
上一个 下一个