qt mdiarea 先addsubwindow 然后findchild(QString) 但是找不到QMdiSubWindow
时间: 2024-01-14 18:04:58 浏览: 27
可能的原因是您没有指定要查找的 QWidget 的父对象。您可以尝试使用以下代码:
```
QMdiSubWindow *subWindow = ui->mdiArea->addSubWindow(widget);
subWindow->setObjectName("MySubWindow");
```
然后,您可以使用以下代码来查找 QMdiSubWindow:
```
QMdiSubWindow *foundSubWindow = ui->mdiArea->findChild<QMdiSubWindow*>("MySubWindow");
if (foundSubWindow != nullptr) {
// 找到了 QMdiSubWindow
}
else {
// 没有找到 QMdiSubWindow
}
```
请确保在查找时使用正确的字符串名称。
相关问题
qt mdiarea findchild
您可以使用`QMdiArea`类的`findChild()`方法来查找指定名称、类型和标志的子对象。例如,如果您想查找一个名为"myChildWidget"的`QWidget`子对象,可以使用以下代码:
```cpp
QWidget *childWidget = mdiArea->findChild<QWidget*>("myChildWidget");
```
其中,`mdiArea`是您的`QMdiArea`对象的指针。您还可以使用其他重载版本的`findChild()`方法来查找不同类型的子对象。请注意,如果未找到指定的子对象,则返回`nullptr`。
qt c++ 去除mdiarea控件中子窗口Qwidget标题栏中的关闭按钮
可以通过重载子窗口的 `showEvent` 函数,在子窗口显示时移除标题栏的关闭按钮。具体步骤如下:
1. 定义一个新的 `QWidget` 类,继承自 `QWidget`。
2. 在新类中重载 `showEvent` 函数。
3. 在 `showEvent` 函数中找到子窗口的标题栏,并且移除标题栏的关闭按钮。
下面是示例代码:
```c++
#include <QEvent>
#include <QLayout>
#include <QLabel>
#include <QPushButton>
#include <QStyle>
#include <QStyleOption>
#include <QToolButton>
#include <QWidget>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget* parent = nullptr)
: QWidget(parent)
{}
protected:
void showEvent(QShowEvent* event) override
{
QWidget::showEvent(event);
auto mdiArea = parentWidget();
if (!mdiArea)
return;
auto subWindow = mdiArea->findChild<QWidget*>("qt_mdiarea_viewport");
if (!subWindow)
return;
auto subLayout = subWindow->layout();
if (!subLayout)
return;
auto titleBar = subLayout->itemAt(0)->widget();
if (!titleBar)
return;
auto closeButton = titleBar->findChild<QToolButton*>("qt_subwindow_button");
if (closeButton)
closeButton->hide();
}
};
```
在使用 `QMainWindow` 中使用 `MyWidget` 类替换 `QWidgets` 作为子窗口,即可在子窗口显示时去除标题栏的关闭按钮。