注意:当前方法不适合Qt中的QOpenGLWidget、OpenGL等绘制,否则会卡顿。
先上三张效果图,分别是原窗口、等比放大窗口和等比缩小窗口。
实现原理,就是借用QGraphicsView的缩放功能来实现的,并且做好QGraphicsView的防锯齿设置,就能完美的适应各种不同分辨率的显示器上了。
分辨率转换原理,如果窗口需要放在大分辨率的显示器上,需要将原窗口view大小调整到大分辨率的窗口对应的大小,然后将view进行scate放大;如果窗口需要放在小分辨率的显示器上,也需要将原窗口view大小调整到小分辨率的窗口对应的大小,需要将view进行scate缩小。
代码如下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
QGraphicsView* view = new QGraphicsView;
QGraphicsScene* scene = new QGraphicsScene();
QGraphicsProxyWidget* wt = scene->addWidget(&w);
view->setStyleSheet("background:transparent");
view->setWindowFlag(Qt::FramelessWindowHint);
view->setAttribute(Qt::WA_TranslucentBackground);
view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view->setScene(scene);
view->setFocusPolicy(Qt::NoFocus); //防止焦点被View抢走,造成主界面事件失效。
view->setFixedSize(800,600);//view->setFixedSize(1920,1080); 调整窗口显示大小,根据要显示的分辨率来。
view->scale(800/1280.00,800/1280.00); //将1280分辨率的窗口进行缩放到分辨率800的窗口上。
view->setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);
view->move(0,0);
view->show();
return a.exec();
}