在Qt里面自定义部件,一般都是继承自QWidget,如果自定义MainWidget
class MainWindow : public QWidget { Q_OBJECT public: MainWindow(QWidget *parent = 0); virtual ~MainWindow(); };
在构造函数MainWindow里面实现如下:
setWindowFlags( Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint); setAttribute(Qt::WA_TranslucentBackground);
Flags 表示无边框,在任务里支持系统菜单,点击任务栏能实现最小化(如果不指定该参数,会失效)。
重载painEvent
A.如果只是用一张图片做背景,不考虑resize问题,可直接用图片填充
QPainter painter(this); painter.fillRect(0, 0, backgroundPixmap_->width(), backgroundPixmap_->height(), *backgroundPixmap_);
B.如果想自己自绘圆角矩形
QBitmap back_ground(size()); QPainter painter(&back_ground); painter.fillRect(rect(),Qt::white); painter.setBrush(QColor(0,0,0)); painter.drawRoundedRect(this->rect(),10,10); setMask(back_ground);
这种方法实现出来的圆角并不完美,圆角看上去像直接切的,没有完美的弧度,不过已经满足需求
C.Qt4教程自定义外观那一章,有讲到如何设置按钮样式,如图
一般窗口的边框Frame,A C G I四块是固定,能保证在窗口改变大小时这四块不变,其他块随着大小伸缩即可
但是如果要自绘边框,主要是D F块,就要考虑D F块也固定
可以通过自绘实现较完美的圆角,可以参考QSkinObject,也可以通过设置加载圆角矩形图片做为背景,切割图片为九块。