这两天研究QT遇到一个问题顺便记录下来。
我们用QT制作一个多文档程序,在主窗口中设置背景图片,子窗口也要设置背景图片,但是在用setStyleSheet方式设置主窗口图片时候如果选用
mdiArea->setStyleSheet("background-image: url(1.jpg);"); // css 图像尺寸不变
背景图片和我们的主窗口的大小是不一致的,如果选用
mdiArea->setStyleSheet("border-image: url(1.jpg);"); // 图像适应屏幕大小
的格式,虽然能够适应屏幕大小,但是子窗口中遇到了问题
如图所示
这里的子窗口是不能调节大小的!!!
通过查阅资料【2】发现了这个问题的症结所在,setStyleSheet会影响子窗口格式,因而我们需要寻找一种方法解决这个问题。在尝试了【2】中提供的各种方法都失败的情形下,在【1】中我们发现了一种新的方法,ie,通过重载resizeEvent函数可以完美解决这个问题。
部分代码如下:
void MainWindow::resizeEvent(QResizeEvent *resizeEvent)
{
mdiArea->setBackground(QBrush(QPixmap(tr("1.jpg")).scaled(
resizeEvent->size().width(),
resizeEvent->size().height())));
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("枯萎的海风"));
setWindowIcon(QIcon("main.png"));
mdiArea = new QMdiArea;
setCentralWidget(mdiArea);
// mdiArea->setBackground(QBrush(QPixmap(tr("1.jpg")).scaled(
// mdiArea->width(), mdiArea->height())));
// mdiArea->setBackground(QBrush(QPixmap(tr("1.jpg")).scaledToHeight(
// mdiArea->height())));
//mdiArea->autoFillBackground();
/*
QPalette palette = mdiArea->palette();
palette.setBrush(QPalette::Background, QColor(0,0,0));
mdiArea->setPalette(palette);
mdiArea->setAutoFillBackground(true);
*/
/* // method2 failed to do so
mdiArea->setAutoFillBackground(true);
QPalette palette;
palette.setBrush(QPalette::Background, QBrush(Qt::red));
mdiArea->setPalette(palette);
*/
/* // mainwindow 中尽量不要使用setstylesheet设置样式
mdiArea->setBackground(Qt::NoBrush);
mdiArea->setStyleSheet("background-image: url(1.jpg);"); // css 图像尺寸不变
mdiArea->setStyleSheet("border-image: url(1.jpg);"); // 图像适应屏幕大小
*/
createActions();
createMenus();
}
我们发现通过在重载函数resizeEvent中设置背景图片后构造函数中可以不再进行背景图片设置,感觉好神奇的样子。
下面放效果图:
至此在主窗口中贴背景图片的方法完美解决