如何更改 MDI 子窗口图标?

Posted

技术标签:

【中文标题】如何更改 MDI 子窗口图标?【英文标题】:How do I change an MDI sub Window icon? 【发布时间】:2014-06-23 12:50:24 【问题描述】:

看下图:

我已经动态创建了Sub Window

我尝试使用setWindowIcon 函数,如下所示:

mdiWindows->setWindowIcon(QIcon("icon.ico"));

但效果不好。

另见以下代码(MDI窗口创建):

QWidget *widget = new QWidget(this);
QTextEdit *TextEdit = new QTextEdit(widget);
TextEdit->setObjectName("myTextEdit");
QMdiSubWindow *mdiWindows = ui->mdiArea->addSubWindow(widget);
mdiWindows->setGeometry(5, 5, 300, 250);
mdiWindows->setWindowTitle("untitled" + QString::number(ui->mdiArea->subWindowList().count()));
mdiWindows->setWindowState(Qt::WindowMaximized);
mdiWindows->layout()->addWidget(TextEdit);
mdiWindows->layout()->setContentsMargins(0,0,0,
mdiWindows->layout()->setSpacing(
mdiWindows->show();

【问题讨论】:

MDI子窗口中显示的图标可以在用于创建窗口的子应用对象的属性中进行编辑。 “窗口图标”属性。 @pes502:我需要一个与我的代码兼容的示例。 你试过用setWindowIcon函数改变图标吗? @RobbieE:我尝试使用mdiWindows->setWindowIcon(QIcon("icon.ico"));,但效果不佳。 setWindowIcon 满足您的需求。如果你不能让它工作,你做一些调试怎么样? “不能正常工作”是什么意思?怎么会失败。 QIcon("icon.ico") 会给你一个有效的图标吗? 【参考方案1】:

怎么了?

我尝试使用setWindowIcon 函数,如下所示: mdiWindows->setWindowIcon(QIcon("icon.ico"));

但是你做错了,因为:

    您在 mdiWindow 本身上设置了图标,而不是在 subWindow 上。 此外,.ico 用于 Windows 中的应用程序图标,您应该 只需使用.jpg.png 格式。默认支持格式列表详情见here。

(如果你坚持.ico文件,有一个变通方法。检查:".ico icons not showing up on Windows")


解决方案:

因此,更改此行mdiWindows->setWindowIcon(QIcon("icon.ico"));

转入:widget->setWindowIcon(QIcon(":/myIcon/icon.png"));

(请注意,您可以在其他 QWidget 衍生产品上执行相同操作:QMainWindow、QDialog...等来设置它们的窗口图标)

换句话说,将上面的行插入到您的代码中:

//QWidget *widget = new QWidget(this);
//QTextEdit *TextEdit = new QTextEdit(widget);
//TextEdit->setObjectName("myTextEdit");
widget->setWindowIcon(QIcon(":/myIcon/icon.png")); 
//QMdiSubWindow *mdiWindows = ui->mdiArea->addSubWindow(widget);
//mdiWindows->setGeometry(5, 5, 300, 250);
//mdiWindows->setWindowTitle("untitled" + QString::number(ui->mdiArea->subWindowList().count()));
//mdiWindows->setWindowState(Qt::WindowMaximized);
//mdiWindows->layout()->addWidget(TextEdit);
//mdiWindows->layout()->setContentsMargins(0,0,0,
//mdiWindows->layout()->setSpacing(
//mdiWindows->show();


附言

以防万一,如果你以后想设置它们,你可以调用QMdiArea::subWindowList()来获取mdiWindows的列表,然后在它们上单独设置图标。例如:

mdiWindows->subWindowList().at(1)->setWindowIcon(QIcon(":/myIcon/icon.png"));

这也是一样的。

【讨论】:

图标文件放在哪里?图标扩展名也是ico 不是pngjpg 为什么是.ico?这是 Eindows 中的应用程序图标。您应该使用普通图片格式,例如.png.jpg 好的,但是我应该把图标文件放在哪里?直接或在.qrc 文件中。 如果您不使用.qrc 文件,像C:/icons/icon.jpg 这样的直接路径也可以,但我建议您使用.qrc 文件管理它们:要使其工作,您可以创建一个项目文件夹中的新文件夹,并将您的图标文件放在那里。然后转到您的.qrc 文件和Add 这些文件到列表中。接下来,在.qrc 文件中,右键单击一个图标,这样您就可以复制间接路径并粘贴到您想要的任何位置。【参考方案2】:

我无法让这个公认的答案起作用。不知道是不是版本相关的bug,我用的是PyQt5,

from PyQt5.QtCore import QT_VERSION_STR
from PyQt5.Qt import PYQT_VERSION_STR
print(f"QT: QT_VERSION_STR, PYQT: PYQT_VERSION_STR")
# QT: 5.9.6, PYQT: 5.9.2

我的解决方法是直接在QMdiSubWindow 上设置图标,而不是小部件。

mdiArea = ...
widget = ...
subwindow = mdiArea.addSubWindow(widget)
subwindow.setWindowTitle("My Widget")
myicon = ...
subwindow.setWindowIcon(myicon)  # <-- this line
widget.show()

请注意,至少在 Windows 上,图标 必须.ico 文件,使用 .png 似乎不起作用,至少对我而言。

【讨论】:

以上是关于如何更改 MDI 子窗口图标?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 MDI 子窗口保持在其兄弟窗口之上?

如何避免在添加新的MDI子窗口时出现屏幕跳动

c# 如何保持一个MDI子窗口永远最大化?

如何在vs 2005 中将mdi父窗口分割成两部分,一边treeview,一边显示子窗口(c# winform)

如何在MDI的主窗口菜单中新建一个菜单选项,点击该选项建立一个新的子窗口

vb6中如何实现类似MDI子窗体的窗体