用c++写一个QWidget程序,当label被点击时切换ui
时间: 2023-11-26 21:03:18 浏览: 156
C++结合Qt开发天气预报项目-教程
好的,以下是一个用 C++ 和 Qt 写的示例程序,实现了当 `QLabel` 被点击时切换 `QWidget` 的功能。
首先,我们需要创建两个 `.ui` 文件,一个是初始界面的 `main.ui`,另一个是切换后的界面的 `switch.ui`。
`main.ui` 的内容如下:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<widget class="QWidget" name="centralwidget">
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>100</x>
<y>100</y>
<width>111</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>Click me to switch UI</string>
</property>
</widget>
</widget>
</widget>
<resources/>
<connections/>
</ui>
```
`switch.ui` 的内容如下:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SwitchWindow</class>
<widget class="QMainWindow" name="SwitchWindow">
<widget class="QWidget" name="centralwidget">
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>100</x>
<y>100</y>
<width>161</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>This is the switched UI</string>
</property>
</widget>
</widget>
</widget>
<resources/>
<connections/>
</ui>
```
接下来,我们需要在代码中加载这两个 `.ui` 文件,并且实现 `QLabel` 的点击事件,以切换界面。
以下是示例代码:
```cpp
#include <QApplication>
#include <QMainWindow>
#include <QLabel>
#include <QCursor>
#include <QVBoxLayout>
#include <QFile>
#include <QTextStream>
#include <QDomDocument>
#include <QDomElement>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr)
: QMainWindow(parent)
{
// 加载初始界面的 .ui 文件
loadUi("main.ui");
// 设置 label 的鼠标样式为手型
label->setCursor(Qt::PointingHandCursor);
// 连接 label 的点击事件
connect(label, &QLabel::clicked, this, &MainWindow::switchUi);
}
private slots:
void switchUi()
{
// 加载切换后的 .ui 文件
QMainWindow *switchWindow = new QMainWindow();
loadUi("switch.ui", switchWindow);
// 切换界面
setCentralWidget(switchWindow->centralWidget());
// 释放资源
delete switchWindow;
}
private:
QLabel *label;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
void loadUi(const char *filename, QWidget *widget)
{
QFile file(filename);
if (!file.open(QFile::ReadOnly | QFile::Text))
return;
QDomDocument doc;
if (!doc.setContent(&file))
{
file.close();
return;
}
file.close();
QDomElement root = doc.documentElement();
if (root.tagName() != "ui")
return;
QDomNodeList widgets = root.elementsByTagName("widget");
if (widgets.isEmpty())
return;
QDomNode widgetNode;
for (int i = 0; i < widgets.count(); i++)
{
QDomNode node = widgets.item(i);
if (node.toElement().attribute("class") == widget->metaObject()->className())
{
widgetNode = node;
break;
}
}
if (widgetNode.isNull())
return;
widget->setLayout(new QVBoxLayout(widget));
QTextStream stream(&file);
widget->layout()->addWidget(QApplication::instance()->loadWidget(&doc, widgetNode));
}
```
在这个示例程序中,我们定义了一个 `MainWindow` 类,继承自 `QMainWindow`。在 `MainWindow` 的构造函数中,我们通过 `loadUi` 方法加载了 `main.ui` 文件,并且设置了 label 的鼠标样式为手型。然后,我们连接了 label 的 `clicked` 信号和 `switchUi` 槽函数。
在 `switchUi` 槽函数中,我们通过 `loadUi` 方法加载了 `switch.ui` 文件,并且创建了一个 `QMainWindow` 实例。然后,我们调用 `setCentralWidget` 方法来切换界面,并且释放了 `QMainWindow` 实例的资源。
最后,在 `main` 函数中,我们创建了一个 `QApplication` 实例,并且创建了 `MainWindow` 实例。最后,我们调用了 `show` 方法来显示界面,并且调用了 `exec` 方法来启动事件循环。
为了支持加载 `.ui` 文件,我们还定义了一个 `loadUi` 函数。这个函数读取 `.ui` 文件,并且使用 `QDomDocument` 和 `QDomElement` 解析出界面中的控件。最后,我们使用 `QApplication::loadWidget` 方法加载控件,并且将它们添加到父控件的布局中。
阅读全文