标签: qt-signals

如何在Qt中检测Windows关闭或注销

我正在将一个Linux应用程序移植到用Qt编写的Windows.应用程序需要在关闭前保存一些设置.在Linux上,我们可以通过SIGTERM等的信号处理程序来实现.我如何在Windows上实现相同的功能.

c++ windows qt qt-signals qtcore

6
推荐指数
2
解决办法
6666
查看次数

QMetaObject :: invokeMethod找不到带参数的方法

这是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)

python qt pyside qt-signals qtcore

6
推荐指数
1
解决办法
2020
查看次数

当我尝试将一个信号连接到插槽时,Qt代码无法编译

我是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)

c++ qt qlineedit qt-signals qtcore

6
推荐指数
1
解决办法
2629
查看次数

是否可以使用`waitForReadyRead()`而不是为`readyRead()`信号创建一个槽?

使用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()也不起作用,否则使用上述方法.由于我的代码很复杂,我无法在此处提供.

c++ ssl qt blocking qt-signals

6
推荐指数
1
解决办法
2163
查看次数

Qt 中的 connect() 调用线程安全吗?

我有两个QObjectsA并且B住在不同的QThreads 中。A将在有匹配的slot时发出信号。我想用来将的信号连接到的插槽。Bconnect()AB

所以问题是,connect()调用线程安全吗?在两个线程中的哪个线程中进行连接是否重要?

qt thread-safety qt-signals

5
推荐指数
1
解决办法
580
查看次数

Qt信号lambda导致shared_ptr泄漏?

我有以下代码:

#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)

c++ lambda qt shared-ptr qt-signals

5
推荐指数
1
解决办法
608
查看次数

在QT Creator中向插槽发出信号,connect()函数在哪里?

在QT Creator的设计模式下,我右键单击小部件并选择“转到插槽”,它会为小部件的信号之一创建一个插槽功能。我以为这会生成一个connect()函数来创建此连接,但是,在任何源代码中都找不到类似的东西。将小部件的信号连接到插槽功能的实际代码在哪里?谢谢

qt connect slot qt-signals

5
推荐指数
1
解决办法
1182
查看次数

将参数从 C++ 传递到 QML

我想将一些参数从 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)

我该怎么做呢?

qt qml qt-signals qtquick2

5
推荐指数
1
解决办法
7501
查看次数

如何使用 Signal 将 python 字典发送到 QML 接口?

我想发送字典,其中包含动态创建 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)

python qml qt-signals qt-slot pyside2

5
推荐指数
1
解决办法
2099
查看次数

QSpinBox 和 QDoubleSpinBox 不调用 valueChanged 上的方法

我想做的就是在 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)

c++ qt qt-signals qt-slot

5
推荐指数
1
解决办法
6585
查看次数