我正在将一个Linux应用程序移植到用Qt编写的Windows.应用程序需要在关闭前保存一些设置.在Linux上,我们可以通过SIGTERM等的信号处理程序来实现.我如何在Windows上实现相同的功能.
这是QMetaObject :: invokeMethod没有找到方法的后续内容.调用没有参数的方法有效.但是将前一个问题扩展到带参数的方法会让我再次陷入失败.
请参阅Python中的以下示例脚本:
from PySide import QtCore
class Example(QtCore.QObject):
def __init__(self):
super().__init__()
@QtCore.Slot()
def dup(self):
beep('dup-class')
@QtCore.Slot(str)
def beep(self, text):
print(text)
@QtCore.Slot()
def dup(self):
beep('dup-local')
@QtCore.Slot(str)
def beep(text):
print(text)
if __name__ == '__main__':
QtCore.QMetaObject.invokeMethod(None, 'dup')
QtCore.QMetaObject.invokeMethod(None, 'beep', QtCore.Qt.AutoConnection, QtCore.QGenericArgument('text', 'beep-local'))
print('now some classy trials')
t = Example()
QtCore.QMetaObject.invokeMethod(t, 'dup')
QtCore.QMetaObject.invokeMethod(t, 'beep', QtCore.Qt.AutoConnection, QtCore.QGenericArgument('text', 'beep-class'))
QtCore.QMetaObject.invokeMethod(t, 'beep', QtCore.Qt.AutoConnection, QtCore.QGenericArgument('self', t), QtCore.QGenericArgument('text', 'beep-class-b'))
Run Code Online (Sandbox Code Playgroud)
在Windows 7和Ubuntu 14.04上使用PySide 1.2.1和Python 3.3的输出也是:
now some classy trials
dup-class
QMetaObject::invokeMethod: No such method Example::beep(text)
QMetaObject::invokeMethod: …Run Code Online (Sandbox Code Playgroud) 我是Qt的新手.我正在尝试实现一个非常简单的计算器程序.只是想放一个按钮,当它点击时,我想要它打印"Hello,World!" 到下一行编辑.当我只有一个按钮时工作正常,但是当我添加第二个按钮时,它不能编译.因为我正在编写一个计算器,所以我需要这些按钮.
以下是错误:
C:\Users\user\Desktop\Calc\build-Calc-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\moc_mainwindow.o:-1: In function `ZN10MainWindow18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv':
C:\Users\user\Desktop\Calc\build-Calc-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\moc_mainwindow.cpp:75: error: undefined reference to `MainWindow::on_pushButton_clicked()'
C:\Users\user\Desktop\Calc\build-Calc-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug\moc_mainwindow.cpp:76: error: undefined reference to `MainWindow::on_pushButton_2_clicked()'
Run Code Online (Sandbox Code Playgroud)
这是MainWindow方法:
void MainWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
MainWindow *_t = static_cast<MainWindow *>(_o);
switch (_id) {
case 0: _t->on_pushButton_clicked(); break;
case 1: _t->on_pushButton_2_clicked(); break;
case 2: _t->on_pushButton_11_clicked(); break;
default: ;
}
}
Q_UNUSED(_a);
}
Run Code Online (Sandbox Code Playgroud)
这是我如何建立连接:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete …Run Code Online (Sandbox Code Playgroud) 使用Qt编写跨平台应用程序(包括带MinGW的Windows).为了从SSL套接字读取数据,我正在创建一个单独的线程.这个帖子是出于历史原因,因为之前的应用程序是使用C socket/ssl/crypto库编写的.现在所有这些都被Qt网络库取代了.
对于阻塞线程,waitForReadyRead(milliseconds)似乎是一个更好的选择.现在根据Qt层次结构:
QIODevice
|
QAbstractSocket
|
QTcpSocket
|
QSslSocket
Run Code Online (Sandbox Code Playgroud)
QAbscractSocket::waitForReadyRead()建议文件:
注意:此功能可能在Windows上随机失败.如果您的软件将在Windows上运行,请考虑使用事件循环和readyRead()信号.
但类似的警告是没有提到的QIODevice::waitForReadyRead().
问题:是否QSslSocket::waitForReadyRead()始终可用于所有平台?
为什么我没有使用readyRead()信号?
出于一些奇怪的原因,如果我使用readyRead()插入一些方法,那么它就不会被调用.此外,QSslSocket :: write()也不起作用,否则使用上述方法.由于我的代码很复杂,我无法在此处提供.
我有两个QObjectsA并且B住在不同的QThreads 中。A将在有匹配的slot时发出信号。我想用来将的信号连接到的插槽。Bconnect()AB
所以问题是,connect()调用线程安全吗?在两个线程中的哪个线程中进行连接是否重要?
我有以下代码:
#include <QApplication>
#include <memory>
#include <QUndoCommand>
#include <QWidget>
class Document
{
public:
Document()
{
qDebug("Document");
}
~Document()
{
qDebug("~Document");
}
QUndoStack mUndostack;
};
class DocumentRepository
{
public:
DocumentRepository()
{
qDebug("DocumentRepository");
}
~DocumentRepository()
{
qDebug("~DocumentRepository");
}
void AddDoc(std::shared_ptr<Document> doc)
{
mDocs.emplace_back(doc);
}
std::vector<std::shared_ptr<Document>> mDocs;
};
class Gui : public QWidget
{
public:
Gui(DocumentRepository& repo)
: mRepo(repo)
{
qDebug("+Gui");
for(int i=0; i<3; i++)
{
CreateDoc();
}
mRepo.mDocs.clear();
qDebug("-Gui");
}
~Gui()
{
qDebug("~Gui");
}
void CreateDoc()
{
auto docPtr = std::make_shared<Document>();
connect(&docPtr->mUndostack, …Run Code Online (Sandbox Code Playgroud) 在QT Creator的设计模式下,我右键单击小部件并选择“转到插槽”,它会为小部件的信号之一创建一个插槽功能。我以为这会生成一个connect()函数来创建此连接,但是,在任何源代码中都找不到类似的东西。将小部件的信号连接到插槽功能的实际代码在哪里?谢谢
我想将一些参数从 C++ 传递到 QML,以便 QML 可以用它们做一些事情。
有点像这样:
void MyClass::myCplusplusFunction(int i, int j)
{
emit mySignal(i, j);
}
Run Code Online (Sandbox Code Playgroud)
在 QML 中,每次mySignal(i, j)发出时,我都想调用 QML 函数并使用i和执行操作j。
Connections {
target: myClass
// mySignal(i, j) is emitted, call myQmlFunction(i,j)
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我想发送字典,其中包含动态创建 qml 对象所需的数据,从 PySide2 类发送到 QML 接口,并且由于我需要响应某些事件来执行此操作,因此我需要使用信号和槽。
由于我刚刚开始使用 QML 和 python,我尝试创建一个简单的项目只是为了玩玩(正如您从代码中看到的)
质量管理语言:
import QtQuick 2.10
import QtQuick.Controls 2.2
import QtQuick.Window 2.2
import QtQuick.Controls.Material 2.3
import QtQuick.Layouts 1.0
ApplicationWindow {
id: mainWindow
width:640
height: 480
title: qsTr("Simple ui")
visible: true
locale:locale
Rectangle {
id: appWindow
objectName: "splasso"
anchors.fill: parent
color: "yellow"
Material.accent: Material.DeepPurple
Material.primary: Material.Cyan
Component.onCompleted: function(){
TestVar.theSignal.connect(catchAnswer);
testList.append(stuff1);
testList.append(stuff2);
testList.append(stuff3);
testCombo.currentIndex = 0;
//Just a pointless test print
console.log(JSON.stringify(stuff1));
}
function catchAnswer(answer){
console.log(JSON.stringify(answer));
}
ComboBox{
id: testCombo
anchors.centerIn: parent
width: …Run Code Online (Sandbox Code Playgroud) 我想做的就是在 qspinbox 和 doublespinbox 的值更改时调用一个方法。
我不需要更改旋转框的实际值,我只是希望它触发另一个方法的调用。为什么下面的代码没有错误或没有执行任何操作?连方法都不调用吗?
程序文件
connect(uiSpinBox, SIGNAL(valueChanged()), this, SLOT(slotInputChanged));
connect(uiDoubleSpinBox, SIGNAL(valueChanged()), this, SLOT(slotInputChanged));
void ColorSwatchEdit::slotInputChanged()
{
qDebug() << "Im here";
}
Run Code Online (Sandbox Code Playgroud)
标头
public:
QSpinBox *uiSpinBox;
QDoubleSpinBox *uiDoubleSpinBox;
public slots:
void slotInputChanged();
Run Code Online (Sandbox Code Playgroud)