在我的 qt 应用程序中,我有一个类(worker),它是从在线程中运行的对象调用的。在我的工人阶级中,我创建了 QList,如下所示
QList <QString> albums;
while (i.hasNext())
{
QRegularExpressionMatch album = i.next();
albums.append(album.captured("album"));
}
emit SignalGotAlbums(albums);
Run Code Online (Sandbox Code Playgroud)
我在另一个包装我的工作线程的类中收到这个信号,以供线程使用。我们将此类命名为 GetAlbumsThread。在那里我成功地在插槽中接收到 SignalGotAlbums
void GetAlbumsThread::Reply(QList <QString> &list)
{
emit gotAlbums(list);
emit finished();
}
Run Code Online (Sandbox Code Playgroud)
在这个插槽中,我正在触发另一个信号gotAlbums,该信号应该与我的gui线程中的插槽连接,并将我的QList传递到那里。我的问题是,当我尝试将 QList 从线程传递到 gui 时,它不起作用!插槽未收到 gotAlbums 信号;
信号声明如下:
void gotAlbums(QList<QString> &);
Run Code Online (Sandbox Code Playgroud)
并连接到我的 gui 插槽(当然在我的 gui 线程中),如下所示:
private slots:
void AlbumsReceived(QList<QString> &list)
...
QThread* albumsThread = new QThread();
GetAlbumsThread *albumsObject = new GetAlbumsThread();
albumsObject->moveToThread(albumsThread);
connect(albumsThread, SIGNAL(started()), albumsObject, SLOT(process()));
connect(albumsObject, SIGNAL(gotAlbums(QList<QString> &)), this, SLOT(AlbumsReceived(QList<QString> &));
albumsThread->start();
Run Code Online (Sandbox Code Playgroud)
由于某种原因,AlbumsReceived 从未被调用。连接返回真。有人可以帮我弄这个吗。我认为问题在于线程之间传递 QList。
您认为设计信号/插槽交互以更新类中的成员值的最佳做法是什么?
例如,考虑在UI上表示的成员变量.用户更改UI中的值.存在信号/槽关系以通过成员变量更新功能自动更新成员变量.
我们还希望在UI上自动更新成员变量的更改,因此另一种方式存在信号/插槽关系.在通过更新功能更新成员变量时,信号触发UI更新.
你如何防止这些成为循环?它是否像调用成员变量更新函数时检查新值与当前值一样简单,如果存在差异,仅发送信号以更新UI?
或者......有更优雅的方式吗?
我正在尝试构建一个在QTabWidget中加载几个网页的小应用程序.这已经很好了.现在我希望在更改当前Tab时重新加载tabs/QWebViews.
我认为将函数"onChange"连接到currentChanged-Event存在问题.
这是我的代码:
#!/usr/bin/env python
import sys, os
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
from PyQt4.QtNetwork import *
from PyQt4 import QtCore, QtGui, QtWebKit
from PyQt4.QtWebKit import QWebView
class BaseWindow(QtGui.QMainWindow):
def __init__(self, parent = None):
QtGui.QMainWindow.__init__(self, parent)
self.centralWidget = QtGui.QWidget()
self.resize(800, 500)
self.setWindowTitle('Test')
self.tabs = QTabWidget()
#self.tabs.connect(self.tabs,SIGNAL("currentChanged(int)"),self,SLOT("onChange(int)")) #tabs,SLOT("tabChangedSlot(int)")
#self.tabs.currentChanged.connect(self.onChange)
self.webview = QWebView()
self.webview.load(QUrl("http://gmx.de"))
self.webview2 = QWebView()
self.webview2.load(QUrl("http://web.de"))
centralLayout = QtGui.QVBoxLayout()
centralLayout.addWidget(self.tabs, 1)
self.tabs.addTab(self.webview, "gmx")
self.tabs.addTab(self.webview2, "web")
self.centralWidget.setLayout(centralLayout)
self.setCentralWidget(self.centralWidget)
#@pyqtSlot()
def onChange(self):
QtGui.QMessageBox.information(self,
"Tab Index …Run Code Online (Sandbox Code Playgroud) 最近我发现我不能在组件槽中使用计算属性或数据属性.即使计算在组件中定义,我也无法在组件的插槽中使用它.有没有办法让它运作?
示例代码:
Vue.component('test-component', {
template: '<div><slot></slot></div>',
computed: {
my_computed: function(){
return 2+3; // not defined in slot
}
}
})
<div id="app">
<test-component>
<span v-text="my_computed"></span>
</test-component>
</div>
Run Code Online (Sandbox Code Playgroud)
在这里查看实例, https://jsfiddle.net/gu9jh4n0/1/
在我的 vue 3 脚本设置组件中,我有这个
<template>
<table>
<tbody>
<template v-for="(row, i) in componentProps.rows">
<tr v-for="(header, j) in componentProps.headers" :key="i + '-' + j" :data-alternating="i%2===0 ? 'even' : 'odd'">
<td class="font-weight-bold text-caption">
{{ header.title }}
</td>
<td>
<template #test>
</template>
</td>
</tr>
</template>
</tbody>
</table>
</template>
<script setup lang='ts'>
const componentProps = defineProps<{
headers: TableHeader[];
rows: {[name:string]:any}[];
}>();
</script>
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误
vite 也抱怨这一点
Codegen node is missing for element/if/for node. Apply appropriate transforms first.
4:00:10 PM [vite] Internal server error: Codegen node is …Run Code Online (Sandbox Code Playgroud) 我是Qt的初学者,试图了解SIGNALand SLOT宏。当我学习使用该connect方法绑定信号和插槽时,我发现Qt官方参考页上的教程使用:
connect(obj1, SIGNAL(signal(int)), obj2, SLOT(slot()))
Run Code Online (Sandbox Code Playgroud)
但是,这也很好用:
connect(obj1, &Obj1::signal, obj2, &Obj2::slot)
Run Code Online (Sandbox Code Playgroud)
那么究竟是什么做的宏SIGNAL和SLOT办?它们是否只是在对象所属的类中寻找信号并返回其地址?
那么,为什么大多数程序员为什么不使用这些宏而不是使用它们,&Obj1::signal因为后者看起来更简单,并且如果信号函数的参数发生变化,则无需更改代码?
有谁知道如何在循环中插入命名槽?例如,我有这个代码:儿童
<div v-for="num in nums" :key="num">
<slot name="foo"></slot>
</div>
Run Code Online (Sandbox Code Playgroud)
而父母是这样的:
<foo-component :nums="nums>
<template slot="foo">
<span>Inside the foo component</span>
</template>
</foo-component>
Run Code Online (Sandbox Code Playgroud)
如果我这样做,控制台将显示此警报:
Duplicate presence of slot "foo" found in the same render tree - this will likely cause render errors.
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
提前致谢
当我尝试在 vue slot 范围内使用两个参数时,我找不到任何关于它的示例。当我使用以下代码实现我的需求时,会报解析错误
<template v-slot:name="text, record">
<div>{{record.name}}</div>
<div>{{record.short_name}}</div>
</template>
Run Code Online (Sandbox Code Playgroud) 早上好,我正在修改 vuetify.js 中数据表的槽头以添加工具提示,所有这些都做得很好,但是 asc 和 desc 的箭头没有显示,我想知道我做错了什么。
<template v-slot:header="{ props: { headers } }">
<thead>
<tr>
<th
style="white-space: nowrap"
:class="['column sortable', pagination.descending ? 'desc' : 'asc', header.value === pagination.sortBy ? 'active' : '']"
@click="changeSort(header.value)"
v-for="element in headers"
:key="element.text">
<v-tooltip top>
<template v-slot:activator="{ on }">
<span v-on="on">{{element.text}}</span>
</template>
<span>{{element.text}}</span>
</v-tooltip>
</th>
</tr>
</thead>
</template>
Run Code Online (Sandbox Code Playgroud) 我想创建带有文本区域的组件并在其中传递数据,例如
<c-textarea> hello world </c-textarea>
Run Code Online (Sandbox Code Playgroud)
但经典<slot/>标签在文本区域内不起作用什么是最简单和最干净的替代方案
<template>
<textarea><slot/></textarea>
</template>
Run Code Online (Sandbox Code Playgroud)
在 Vue.js 3 中