'QWidget::QWidget(const QWidget&)'QObject::connect(socket, &QTcpSocket::readyRead, [=](){ 报两个错的原因:: error: use of deleted function C:\Users\Lenovo\Desktop\bar_test\bar_test\mainwindow.cpp:44: error: 'QWidget::QWidget(const QWidget&)' is private within
时间: 2023-12-18 16:05:39 浏览: 29
这个错误是因为 `QObject::connect` 函数中的 lambda 表达式捕获了 `this` 指针,而 `this` 指针是指向当前对象的指针。而在 `QObject::connect` 函数中,连接的两个对象必须是不同的对象,因为它们会在不同的线程中执行。所以你不能在 lambda 表达式中捕获 `this` 指针。
为了解决这个问题,你可以使用 `QObject::connect` 函数的重载形式,将 `this` 指针作为第五个参数传递进去,这个参数指定信号的接收者。例如:
```
QObject::connect(socket, &QTcpSocket::readyRead, this, [=](){
// 处理 readyRead 信号
});
```
另外,关于第二个错误,它是因为 `QWidget` 类的复制构造函数被声明为私有,所以你不能直接复制一个 `QWidget` 对象。在连接信号和槽时,你应该传递 `this` 指针,而不是复制当前对象。
相关问题
&QWidget::close;和QWidget::close();的区别
`&QWidget::close`和`QWidget::close()`的区别在于函数调用与函数指针的使用。
- `&QWidget::close`是获取`QWidget::close`函数的函数指针,并不会调用该函数。你可以将这个函数指针存储起来,然后在需要的时候通过指针调用该函数。
- `QWidget::close()`是直接调用`QWidget::close`函数。这种方式会立即执行`QWidget::close`函数中的代码。
所以,如果你想要获取函数指针而不是立即调用函数,你应该使用`&QWidget::close`。如果你想要立即调用函数并执行其中的代码,你应该使用`QWidget::close()`。
QWidget::createWindowContainer 用法
`QWidget::createWindowContainer` 是一个静态函数,用于将 QWidget 转换为一个可以嵌入到其他窗口系统中的窗口容器。它的函数原型如下:
```cpp
QWidget *QWidget::createWindowContainer(QWidget *widget, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags());
```
其中,`widget` 是要转换的 QWidget 对象,`parent` 是容器的父窗口,如果没有指定,就会创建一个新的顶级窗口作为父窗口;`flags` 是容器的标志,它是一个按位或的枚举值,可以用来设置容器的各种属性,比如窗口样式、窗口标题等等。
使用 `createWindowContainer` 函数可以将一个 QWidget 对象转换为一个 `QWindow` 对象,从而可以将它嵌入到其他窗口系统中,比如 Qt Quick 中的 Item 或 QML 中的 Window。以下是一个简单的示例代码:
```cpp
// 创建一个 QWidget 对象
QWidget *myWidget = new QWidget();
// 将 QWidget 转换为 QWindow,并将它嵌入到一个 QML 窗口中
QQuickView *qmlView = new QQuickView();
QWindow *qmlWindow = qmlView->rootObject();
QWidget *container = QWidget::createWindowContainer(myWidget, qmlWindow);
qmlView->setContent(container);
qmlView->show();
```
在这个例子中,我们首先创建了一个 QWidget 对象 `myWidget`,然后将它转换为一个 QWindow,并将它嵌入到一个 QML 窗口中。最后,我们通过 `qmlView->setContent(container)` 将 QML 窗口的内容设置为容器,从而实现了将 QWidget 嵌入到 QML 窗口中的效果。