Qt的connect槽函数

2023-11-11

一、connect()函数的不同参数形式,以及其区别、优略

除2(未知)之外,总体分为三种形式:1/3信号和槽转为字符串形参的connect函数、4/5/6/7/8信号和槽转为可调用对象的connect函数、9转到槽函数

1、将信号连接到另一个对象的成员函数(SIGNAL和SLOT宏实现)
原型:

static QMetaObject::Connection 
connect(const QObject *sender, const char *signal,
		const QObject *receiver, const char *member,
		Qt::ConnectionType = Qt::AutoConnection);

调用示例:

connect(ui->pushButton_1, SIGNAL(clicked(bool)), this, SLOT(onPushButton2Clicked()));

2、未知
原型:

static QMetaObject::Connection 
connect(const QObject *sender, const QMetaMethod &signal,
		const QObject *receiver, const QMetaMethod &method,
		Qt::ConnectionType type = Qt::AutoConnection);

调用示例:

/无

3、将信号连接到信号发送对象的成员函数
原型:

static QMetaObject::Connection
connect(const QObject *sender, const QMetaMethod &signal,
	const QObject *receiver, const QMetaMethod &method,
	Qt::ConnectionType type = Qt::AutoConnection);

调用示例:

connect(ui->pushButton_3, SIGNAL(clicked(bool)), SLOT(onPushButton3Clicked()));

说明:
内部实现为第1个

return connect(asender, asignal, this, amember, atype);

4、将信号连接到另一个对象的成员函数(模板方法,信号和槽对象的形参为可调用对象)
原型:

template <typename Func1, typename Func2>
static inline QMetaObject::Connection 
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
	const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot,
	Qt::ConnectionType type = Qt::AutoConnection);

调用示例:

connect(ui->pushButton_4, &QPushButton::clicked, this, &MainWindow::onPushButton4Clicked);

5、将信号连接到一个函数指针(非类的静态函数、非类的成员函数、非仿函数)
原型:

template <typename Func1, typename Func2>
static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0, QMetaObject::Connection>::type
	connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot);

调用示例:

connect(ui->pushButton_5, &QPushButton::clicked, &onPushButton5Clicked);

说明:
a、内部实现为第5个

return connect(sender, signal, sender, slot, Qt::DirectConnection);

b、没有有第五参数,内部实现第五参数为Qt::DirectConnection

6、将信号连接到一个函数指针(非类的成员函数,一般为类的静态函数)
原型:

template <typename Func1, typename Func2>
static inline typename std::enable_if<int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0 &&
	!QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction, QMetaObject::Connection>::type
	connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
		Qt::ConnectionType type = Qt::AutoConnection);

调用示例:

connect(ui->pushButton_5, &QPushButton::clicked, this, &MainWindow::onPushButton5Clicked);

说明:
非类的成员函数

int(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0 && !QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction

7、将信号连接到一个仿函数
原型:

template <typename Func1, typename Func2>
static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::type
	connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot);

调用示例:

connect(ui->pushButton_7, &QPushButton::clicked, onPushButton7Clicked());
connect(ui->pushButton_8, &QPushButton::clicked, [=](bool check) {
		//do something
		qDebug() << "do something" << endl;
		qDebug() << "PushButton 8 Clicked" << endl;
	});

说明:
a、没有获取到模板参数Fun2的参数数量,即只有仿函数“类重载了()运算符”

QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1

b、但是不太清楚lambda表达式也重载的是该connect()函数,本以为会重载第5个
c、内部实现为第6个

return connect(sender, signal, sender, slot, Qt::DirectConnection);

d、没有有第五参数,内部实现第五参数为Qt::DirectConnection

return connect(sender, signal, sender, std::move(slot), Qt::DirectConnection);

8、将信号连接到连接到一个仿函数,用一个“context”对象定义将在哪个事件循环中执行
原型:

template <typename Func1, typename Func2>
static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::type
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
	const QObject *context, Func2 slot,
	Qt::ConnectionType type = Qt::AutoConnection);

调用示例:

//无

9、转到槽函数

on_pushButton_clicked()

说明:
从可视化界面的空间鼠标右键转到槽,选择槽函数自动生成

二、connect的信号和槽参数列关系要求
1、无论信号和槽参数列是否有默认形参,信号函数的参数个数一定多于或等于槽函数的参数个数
2、信号和槽对应匹配的参数必须能进行类型转换(double->float)或符合类型兼容规则(MainWindow->QMainWindow)

///"mainwindow.h"
signals:
	void signalFun1(MainWindow* This,double d);
private slots:
	void slotFun1(QMainWindow* This, float f);
///"mainwindow.cpp"
connect(this, &MainWindow::signalFun1, this,&MainWindow::slotFun1);

三、信号或者槽函数发送生重载怎么处理
1、1/3信号和槽转为字符串形参的connect函数(SIGNAL和SLOT宏实现)不会出现此问题,但是会连接失败
2、9转到槽函数不存在不匹配问题,直接调对应的重载版本的槽函数
3、4/5/6/7/8使用示例中信号和槽若重载,一般都会导致编译失败
a、信号重载解决方法如下:

///函数指针类型明确使用重载版本
connect(this, static_cast<void (MainWindow::*)(double)>(&MainWindow::signalFun2), this, &MainWindow::slotFun2);
///新写法
connect(this, QOverload<QString>::of(&MainWindow::signalFun2), this, &MainWindow::slotFun4);

c、槽重载解决方法如下:
和信号的方法一致

四、槽函数中获取信号发送者
QPushButton信号对应的槽函数中获取

QPushButton * QPB_sender = qobject_cast<QPushButton *>(sender());

五、connect()函数的返回值
1、连接失败返回false
2、连接成功返回QMetaObject::Connection对象

Connection的官方解释:

表示信号槽(或信号函子)连接的句柄。

它可以用来检查连接是否有效,并使用QObject::disconnect()断开连接。对于没有上下文对象的信号-函子连接,这是有选择地断开该连接的唯一方法。

由于Connection只是一个句柄,因此当Connection被破坏或重新分配时,底层的信号槽连接不受影响。

六、connect()函数第五参数
1、Qt::AutoConnection
自动连接:(默认)如果接收者和发送者在同一个线程,使用Qt::DirectConnection;否则,使用Qt::QueuedConnection。在发出信号时确定连接类型。

2、Qt::DirectConnection
直接连接:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。
多线程环境下会造成奔溃。

3、Qt::QueuedConnection
队列连接:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。
参数类型没有注册等导致连接失败。

4、Qt::BlockingQueuedConnection
阻塞队列连接:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
如果接收方在发送信号的线程中,则不能使用此连接,否则应用程序将死锁。
5. Qt::UniqueConnection
唯一连接:这个flag可以通过按位或(|)与以上四个结合在一起使用。表示只有它不是一个重复连接,连接才会成功。如果之前已经有了一个链接(相同的信号连接到同一对象的同一个槽上),那么连接将会失败并将返回false。

if((c->connectionType == Qt::AutoConnection && !receiverInSameThread)
                || (c->connectionType == Qt::QueuedConnection)) {
    // 队列处理
} else if (c->connectionType == Qt::BlockingQueuedConnection) {
    // 阻塞处理
    // 如果同线程,打印潜在死锁。
} else {
    //直接调用槽函数或回调函数
}

提示: 线程A向Gui主线程发送消息用Qt::BlockingQueuedConnection。若用Qt::AutoConnection连接,又在线程A中更新界面控件数据会导致Gui主线程显示异常,A为分离线程会发生概率性崩溃。

七、disconnect()函数作用
断开槽函数连接

八、信号和槽的特点
1、信号由Qt关键字signals限定定义在头文件中,无需程序员实现函数体,函数体由编译产生
2、信号和槽的返回值都为void
3、槽函数有函数体的实现
4、槽函数可以有public slots、private slots 和 protected slots三种访问限制,访问特点和普通函数一样。
5、槽函数也可以为虚函数

九、connect()函数实现原理

1、信号与槽的实现是借助了Qt 的元对象系统,元对象系统有一个元对象编译器,程序编译之前会有一个预处理过程,预处理将一个类/对象中的信号,槽的字符串值分别保存在一个容器中,可能是字符串或者其他的有序容器。

2、现在有两个容器,比如string_sig,保存了所有的信号的字符串值;string_slot保存了所有的槽函数的字符窜值。

3、每次调用connect()函数建立信号与槽的连接,就是将给定信号与给定的接收方及其槽函数存储在发送方对象的映射容器中,比如multimap,建立起信号与槽的一一对应关系。

4、发射信号其实就是调用信号函数(信号就是一种函数),根据该信号的索引在multimap中找到对应的槽函数,在调用槽函数即可。

5、信号与槽的本质就是函数的调用。

编译生成的moc_mainwindow.cpp文件

struct qt_meta_stringdata_MainWindow_t {
    QByteArrayData data[23];
    char stringdata0[292];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
    qptrdiff(offsetof(qt_meta_stringdata_MainWindow_t, stringdata0) + ofs \
        - idx * sizeof(QByteArrayData)) \
    )
static const qt_meta_stringdata_MainWindow_t qt_meta_stringdata_MainWindow = {
    {
QT_MOC_LITERAL(0, 0, 10), // "MainWindow"
QT_MOC_LITERAL(1, 11, 10), // "signalFun1"
QT_MOC_LITERAL(2, 22, 0), // ""
QT_MOC_LITERAL(3, 23, 11), // "MainWindow*"
QT_MOC_LITERAL(4, 35, 4), // "This"
QT_MOC_LITERAL(5, 40, 1), // "d"
QT_MOC_LITERAL(6, 42, 10), // "signalFun2"
QT_MOC_LITERAL(7, 53, 4), // "qstr"
QT_MOC_LITERAL(8, 58, 10), // "signalFun3"
QT_MOC_LITERAL(9, 69, 21), // "on_pushButton_clicked"
QT_MOC_LITERAL(10, 91, 20), // "onPushButton2Clicked"
QT_MOC_LITERAL(11, 112, 20), // "onPushButton3Clicked"
QT_MOC_LITERAL(12, 133, 20), // "onPushButton4Clicked"
QT_MOC_LITERAL(13, 154, 20), // "onPushButton9Clicked"
QT_MOC_LITERAL(14, 175, 21), // "onPushButton10Clicked"
QT_MOC_LITERAL(15, 197, 21), // "onPushButton11Clicked"
QT_MOC_LITERAL(16, 219, 21), // "onPushButton12Clicked"
QT_MOC_LITERAL(17, 241, 8), // "slotFun1"
QT_MOC_LITERAL(18, 250, 12), // "QMainWindow*"
QT_MOC_LITERAL(19, 263, 1), // "f"
QT_MOC_LITERAL(20, 265, 8), // "slotFun2"
QT_MOC_LITERAL(21, 274, 8), // "slotFun3"
QT_MOC_LITERAL(22, 283, 8) // "slotFun4"

    },
    "MainWindow\0signalFun1\0\0MainWindow*\0"
    "This\0d\0signalFun2\0qstr\0signalFun3\0"
    "on_pushButton_clicked\0onPushButton2Clicked\0"
    "onPushButton3Clicked\0onPushButton4Clicked\0"
    "onPushButton9Clicked\0onPushButton10Clicked\0"
    "onPushButton11Clicked\0onPushButton12Clicked\0"
    "slotFun1\0QMainWindow*\0f\0slotFun2\0"
    "slotFun3\0slotFun4"
};
#undef QT_MOC_LITERAL

static const uint qt_meta_data_MainWindow[] = {

 // content:
       8,       // revision
       0,       // classname
       0,    0, // classinfo
      17,   14, // methods
       0,    0, // properties
       0,    0, // enums/sets
       0,    0, // constructors
       0,       // flags
       4,       // signalCount

 // signals: name, argc, parameters, tag, flags
       1,    2,   99,    2, 0x06 /* Public */,
       6,    1,  104,    2, 0x06 /* Public */,
       6,    1,  107,    2, 0x06 /* Public */,
       8,    1,  110,    2, 0x06 /* Public */,

 // slots: name, argc, parameters, tag, flags
       9,    0,  113,    2, 0x08 /* Private */,
      10,    0,  114,    2, 0x08 /* Private */,
      11,    0,  115,    2, 0x08 /* Private */,
      12,    0,  116,    2, 0x08 /* Private */,
      13,    0,  117,    2, 0x08 /* Private */,
      14,    0,  118,    2, 0x08 /* Private */,
      15,    0,  119,    2, 0x08 /* Private */,
      16,    0,  120,    2, 0x08 /* Private */,
      17,    2,  121,    2, 0x08 /* Private */,
      20,    1,  126,    2, 0x08 /* Private */,
      21,    1,  129,    2, 0x08 /* Private */,
      21,    1,  132,    2, 0x08 /* Private */,
      22,    1,  135,    2, 0x08 /* Private */,

 // signals: parameters
    QMetaType::Void, 0x80000000 | 3, QMetaType::Double,    4,    5,
    QMetaType::Void, QMetaType::Double,    5,
    QMetaType::Void, QMetaType::QString,    7,
    QMetaType::Void, QMetaType::QString,    7,

 // slots: parameters
    QMetaType::Void,
    QMetaType::Void,
    QMetaType::Void,
    QMetaType::Void,
    QMetaType::Void,
    QMetaType::Void,
    QMetaType::Void,
    QMetaType::Void,
    QMetaType::Void, 0x80000000 | 18, QMetaType::Float,    4,   19,
    QMetaType::Void, QMetaType::Double,    5,
    QMetaType::Void, QMetaType::Double,    5,
    QMetaType::Void, QMetaType::QString,    7,
    QMetaType::Void, QMetaType::QString,    7,

       0        // eod
};

void MainWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
    if (_c == QMetaObject::InvokeMetaMethod) {
        auto *_t = static_cast<MainWindow *>(_o);
        Q_UNUSED(_t)
        switch (_id) {
        case 0: _t->signalFun1((*reinterpret_cast< MainWindow*(*)>(_a[1])),(*reinterpret_cast< double(*)>(_a[2]))); break;
        case 1: _t->signalFun2((*reinterpret_cast< double(*)>(_a[1]))); break;
        case 2: _t->signalFun2((*reinterpret_cast< QString(*)>(_a[1]))); break;
        case 3: _t->signalFun3((*reinterpret_cast< QString(*)>(_a[1]))); break;
        case 4: _t->on_pushButton_clicked(); break;
        case 5: _t->onPushButton2Clicked(); break;
        case 6: _t->onPushButton3Clicked(); break;
        case 7: _t->onPushButton4Clicked(); break;
        case 8: _t->onPushButton9Clicked(); break;
        case 9: _t->onPushButton10Clicked(); break;
        case 10: _t->onPushButton11Clicked(); break;
        case 11: _t->onPushButton12Clicked(); break;
        case 12: _t->slotFun1((*reinterpret_cast< QMainWindow*(*)>(_a[1])),(*reinterpret_cast< float(*)>(_a[2]))); break;
        case 13: _t->slotFun2((*reinterpret_cast< double(*)>(_a[1]))); break;
        case 14: _t->slotFun3((*reinterpret_cast< double(*)>(_a[1]))); break;
        case 15: _t->slotFun3((*reinterpret_cast< QString(*)>(_a[1]))); break;
        case 16: _t->slotFun4((*reinterpret_cast< QString(*)>(_a[1]))); break;
        default: ;
        }
    } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
        switch (_id) {
        default: *reinterpret_cast<int*>(_a[0]) = -1; break;
        case 0:
            switch (*reinterpret_cast<int*>(_a[1])) {
            default: *reinterpret_cast<int*>(_a[0]) = -1; break;
            case 0:
                *reinterpret_cast<int*>(_a[0]) = qRegisterMetaType< MainWindow* >(); break;
            }
            break;
        case 12:
            switch (*reinterpret_cast<int*>(_a[1])) {
            default: *reinterpret_cast<int*>(_a[0]) = -1; break;
            case 0:
                *reinterpret_cast<int*>(_a[0]) = qRegisterMetaType< QMainWindow* >(); break;
            }
            break;
        }
    } else if (_c == QMetaObject::IndexOfMethod) {
        int *result = reinterpret_cast<int *>(_a[0]);
        {
            using _t = void (MainWindow::*)(MainWindow * , double );
            if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&MainWindow::signalFun1)) {
                *result = 0;
                return;
            }
        }
        {
            using _t = void (MainWindow::*)(double );
            if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&MainWindow::signalFun2)) {
                *result = 1;
                return;
            }
        }
        {
            using _t = void (MainWindow::*)(QString );
            if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&MainWindow::signalFun2)) {
                *result = 2;
                return;
            }
        }
        {
            using _t = void (MainWindow::*)(QString );
            if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&MainWindow::signalFun3)) {
                *result = 3;
                return;
            }
        }
    }
}

QT_INIT_METAOBJECT const QMetaObject MainWindow::staticMetaObject = { {
    QMetaObject::SuperData::link<QMainWindow::staticMetaObject>(),
    qt_meta_stringdata_MainWindow.data,
    qt_meta_data_MainWindow,
    qt_static_metacall,
    nullptr,
    nullptr
} };


const QMetaObject *MainWindow::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}

void *MainWindow::qt_metacast(const char *_clname)
{
    if (!_clname) return nullptr;
    if (!strcmp(_clname, qt_meta_stringdata_MainWindow.stringdata0))
        return static_cast<void*>(this);
    return QMainWindow::qt_metacast(_clname);
}

int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QMainWindow::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        if (_id < 17)
            qt_static_metacall(this, _c, _id, _a);
        _id -= 17;
    } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
        if (_id < 17)
            qt_static_metacall(this, _c, _id, _a);
        _id -= 17;
    }
    return _id;
}

参考:
Qt connect的实现原理:https://blog.csdn.net/weixin_52511809/article/details/115728244

Qt进阶之路:https://zhuanlan.zhihu.com/p/80539605

拓展1:设计模式的观察者模式
拓展2:函数回调(回调函数是否为虚函数)
拓展3:槽函数为虚函数的使用

本文测试代码下载链接:https://download.csdn.net/download/qq_43148810/55122137

如有错误或不足欢迎评论指出!创作不易,转载请注明出处。如有帮助,记得点赞关注哦(⊙o⊙)
更多内容请关注个人博客:https://blog.csdn.net/qq_43148810

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt的connect槽函数 的相关文章

  • Qt 自定义外观和感觉?

    我可以强制我的 Qt 应用程序使用不同的外观和感觉 就像在 KDE 中一样吗 您始终可以使用 QApplication setStyle 更改小部件的样式 Qt4 中有一些预定义的选项可用 在 main cpp 中做这样的事情 includ
  • 发送一系列命令并等待响应

    我必须更新连接到串行端口的设备上的固件和设置 由于这是通过一系列命令完成的 因此我发送命令并等待收到答案 在答案 多行 中 我搜索一个字符串 该字符串指示操作是否成功完成 Serial gt write boot 1000 Serial g
  • Qt 在信号/槽中使用 boost::shared_ptr

    是否可能 如果可以 如何在 Qt 中创建一个对共享指针常量引用的信号 槽 我想要一个如下所示的信号 void signal shared ptr
  • 当鼠标位于 Qt 窗口的自定义小部件上时,如何移动整个窗口?

    假设我有一个自定义小部件并将其添加到 qt 的主窗口中 如您所见 红色区域是自定义小部件 我想要做的是 当鼠标在红色区域按下并移动时 整个窗口也会移动 我知道如何简单地实施mousePressEvent and mouseMoveEvent
  • Ncurses 和 Qt 互操作性

    拥有基于 Qt 和 ncurses 的应用程序 在等待用户输入时每秒刷新屏幕的最佳方法是什么 例如显示时钟并获取用户输入 我需要 CPU 使用率和应用程序响应能力之间的最佳折衷 更具体地说 如何获取用户输入并仍然使用QTimer以及信号槽机
  • QT:隐藏对话框/窗口的标题栏

    我有一个父窗口 其中按钮的单击事件函数具有以下几行 SplashScreenDialog splScrDlg new SplashScreenDialog this splScrDlg gt show 我想要的是我想从对话框 或窗口 中删除
  • 故障转储分析:CxxUnhandledExceptionFilter

    我有一个崩溃小型转储需要分析 我的程序是多线程Qt5应用程序 我不是调试专家 但通常我可以轻松找到程序失败的地方 但这次我不能 我在 Visual Studio 2010 中打开转储文件 单击 仅使用本机调试 它向我显示问题所在 它是位置为
  • QtWebKit 无需安装 flash 播放器即可播放 HTML5 视频

    安装最新的 Flash 播放器并启用插件后 我的简单示例可以播放 YouTube 视频 操作系统 Windows 7 Qt 4 7 4 32 位和 64 位均可 但是 根据 http www youtube com html5 我的示例浏览
  • 部署 Qt Quick 演示应用程序 Minehunt 时出现全白屏幕

    为了测试部署过程 我尝试部署附带的演示应用程序 Minehunt 我能够让它运行 没有崩溃或错误 但屏幕是全白的 我相信这通常意味着我缺少插件 Dependency walker 报告没有问题 我什至尝试包含 Qt MingW 插件目录中的
  • 具有最简单学习曲线的 C++ GUI 构建选项是什么 - VS/Qt/wxWidgets/等等?

    我希望能够尽可能快速 轻松地构建 GUI 应用程序 我有能力 虽然不是专家 也没有接受过正式的培训 C 但从未使用过 GUI 构建工具包或框架或任何东西 我不是专业程序员 在构建 GUI 应用程序方面完全没有经验且无知 花了几个小时研究试图
  • 安装 PyQt

    我正在尝试在我的 mac 上安装 PyQt 以便可以安装 python Ghost 我已经安装了Qt和SIP 我已经下载了 PyQt 但是当我运行时 python configure ng py 我收到以下错误 Error Use the
  • 对 MasterController::StaticMetaObject 的未定义引用

    我刚刚开始学习 Qt 目前正在阅读这本书学习 Qt 5 作者 Nicolas Sheriff 在我所在的位置 在第 2 章中 我遵循所有说明 并且理解我在做什么 但我陷入了一件事 当我与其他程序一起编译以下程序时 我收到此错误列表 显示错误
  • 为什么 RangeSlider 在 QtQuick 中可用,而不是作为标准 Widget

    我需要像范围滑块 具有两个用于设置最小 最大值的手柄的滑块 之类的东西 我注意到有一个RangeSlider在 QtQuick 和 QML 无论是什么 中 但没有 标准小部件 例如QRangeSlider 为什么是这样 我可以用那个吗Ran
  • 无法在Mac上安装qwt设计器插件

    我无法在 Mac 上安装 qwt 设计器插件 我已经下载了 v 6 1 3 并成功完成了 qmake make 和 sudo make install 问题是 在 usr local qwt 6 1 3 lib 下 我只有文件 qwt fr
  • QSpinBox 具有用于十六进制输入的 Unsigned Int

    这里写了很多关于 QSpinBox 使用 int 作为其数据类型的限制的问题 人们通常希望显示更大的数字 就我而言 我希望能够以十六进制显示无符号 32 位整数 这意味着我希望我的范围为 0x0 0xFFFFFFFF 正常的 QSpinBo
  • 为什么我的 QGestureRecognizer 收不到触摸事件?

    上下文 我正在尝试创建一个类似推子的小部件 它可以在同一视图中具有多个实例 每个实例都可以由不同的手指同时控制 我想用Qt的手势识别系统 http qt project org doc qt 4 8 gestures overview ht
  • Qt 捕获按下的键

    我想到写原始蛇 我有一个窗口 程序可以在其中绘制随机线条 但我想不出如何捕捉按下的键来改变画线的方向 class QUpdatingPathIte public QGraphicsPathItem void advance int phas
  • 使用Qt设置http get请求参数

    我正在 Qt 中开发一个基本应用程序 它使用 REST API 从 Parse com 检索数据 我浏览了一些类参考和 cURL 手册 但仍然不清楚如何设置请求参数 例如 我想对用户进行身份验证 这是 Parse 提供的curl 示例 cu
  • Qt同步QNetworkAccessManager获取

    执行同步 QNetworkAccessManager get 的正确方法是什么 The qt wiki http qt shoutwiki com wiki How to wait synchronously for a Signal in
  • 如何设置 QTableView 中特定单元格的线条样式?

    我正在使用 QT GUI 我正在使用 QTableView 实现一个简单的十六进制编辑控件 我最初的想法是使用一个有十七列的表格 表的每一行都有 16 个十六进制字节 然后在第十七列中显示该数据的 ASCII 表示形式 理想情况下 我想编辑

随机推荐

  • Niginx

    基础 流程 分为正向代理和反向代理 在反向代理中 访问地址被nginx所拦截 而后 转发到其他位置 通过server进行处理 其中 server name和listen用来匹配服务器 不针对其后的具体路径 server匹配成功后 通过rew
  • linux ffmpeg开发环境搭建(基于ubuntu14.04和ffmpeg3.2)

    本文将介绍ffmpeg开发环境的安装测试和更新的步骤 基于ubuntu14 04和ffmpeg3 2 1 安装x264 1 libx264需要yasm 所以先安装yasm sudo apt get install yasm 2 安装libx
  • 修改jar包package目录结构操作方法

    开发中会遇到用第三方的jar包 有时候会出现不同的jar包 包名一致的情况 这就会引发运行时异常 找不到相应的jar包 这种问题时常困扰我们很长时间 下面提出一种解决办法 例如gson jar 1 新建一个文件夹 2 将要修改的jar包放到
  • 解读网易财报:游戏营收创新高,在线教育扬眉吐气?

    近期 不少中概股已相继对外发布新一季财报 5月18日 国内互联网巨头网易公布了2021年一季度业绩报告 从一季度的业绩表现而言 网易营收实现了新增长 超出市场及分析师的预期 在净利方面 摆脱了连续两个季度的负增长 亦超出分析师预期 受财报利
  • 读写.ini文件

    读写 ini文件 零 前言 一 写 二 读 总 零 前言 ini文件是程序的配置文件 它用来记录历史信息 界面信息 用户操作等 当然除了ini文件可以保存信息 其它文件也可以保存操作的 json txt csv等 如果数据比较少且读写不频繁
  • 机器学习算法总结--线性回归和逻辑回归

    1 线性回归 简述 在统计学中 线性回归 Linear Regression 是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析 这种函数是一个或多个称为回归系数的模型参数的线性组合 自变量都是一次
  • ChatGPT报错“Too many requests in 1 hour.Try again later“

    一 出现 Too many requests in 1 hour Try again later 怎么回事 如果您在使用ChatGPT时出现了 Too many requests in 1 hour Try again later 一小时内
  • 24张架构图把数据治理核心内容讲透了

    前言 随着信息革命和信息化的飞速发展 计算机数据量的急剧增长 数据利用和管理的重要性与日俱增 数据逐渐在信息化这个大舞台上扮演着越来越重要的角色 数据治理是企业大数据基础 企业级数据平台助力企业数字化转型 在目前数字化转型大趋势的推动下 企
  • 【机试题(实现语言:python3)】字符串运用-密码截取(最长回文子串)

    题目描述 给定一个仅包含小写字母的字符串 求它的最长回文子串的长度 所谓回文串 指左右对称的字符串 所谓子串 指一个字符串删掉其部分前缀和后缀 也可以不删 的字符串 注意 记得加上while处理多个测试用例 输入描述 输入一个仅包含小写字母
  • Qt编程 (一)

    一 Qt简介 1 Qt是什么 图形用户程序框架 是对底层应用编程接口API面向对象的封装 是一套基于C 语言的类库 专注但不局限于图形用户界面的开发 也可以进行系统调用 网络编程 数据库 2D 3D图形处理 特点 跨平台 支持Linux W
  • hosts文件被删除了如何解决

    一 给etc目录授权 进入c windows system32 drivers etc 选中etc目录 右键 属性 高级 二 恢复hosts文件 进入目录C Windows System32 drivers etc 新建hosts txt
  • python三次样条插值拟合的树行线_R语言:样条回归

    01 解决何种问题 线性回归都知道是用来描述两个变量之间的线性关系 比如身高和体重 自变量身高每增加1个单位 因变量体重就变化多少 但是现实中能用线性回归描述的情况太少了 绝大部分关系都是非线性关系 这个时候就必须用其他回归来拟合了 例如类
  • 面向对象基础2-关键字

    目录 前言 一 private关键字 二 private关键字的使用 三 this关键字 四 public关键字 五 protected 六 default 总结 前言 一 private关键字 private属于私有访问权限 用于修饰类的
  • ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

    1 问题描述 ubuntu系统中安装好anaconda后 又继而安装了ROS 并通过命令 pip install opencv python 安装opencv的情况下 此时安装的opencv python包是存放在anaconda下的 而在
  • Linux中的一些指令及./详解

    在 Linux 中有许多常见的指令用于执行各种任务 以下是一些常见的 Linux 指令及其用法的总结 ls 列出目录中的文件和子目录 用法 ls 选项 目录 cd 改变当前工作目录 用法 cd 目录 pwd 显示当前工作目录的路径 用法 p
  • js逆向案例三

    目录 零 概述 一 请求参数 Cookie Referer校验 二 参数响应加密解密AES DES RSA 三 其它js混淆 1 案例7 百变ip eval 2 案例8 聚合图床 sojson v6 3 案例9 SH行政处罚 sojson
  • varest插件使用

  • 数据结构学习——顺序栈和链式栈的简单实现和解析(C语言版)

    数据结构 栈的简单解析和实现 一 概念 二 入栈 push 三 出栈 pop 四 顺序栈简单实现 1 进栈操作 2 出栈操作 一 概念 本篇所讲解的栈和队列属于逻辑结构上的划分 逻辑结构分为线性结构 非线性结构 线性结构 有且仅有一个开始节
  • GD32E230芯片无法识别

    GD32E230芯片无法识别 GD32E230板子回来后 开始接上jlink烧录 但是板子第一次能烧录然后第二次就不行的了 换了好几个板子都是 搞了好几个小时 整个人都快崩溃了 后面也是经过不断的尝试 终于搞好了 总结了一下 主要要注意的问
  • Qt的connect槽函数

    一 connect 函数的不同参数形式 以及其区别 优略 除2 未知 之外 总体分为三种形式 1 3信号和槽转为字符串形参的connect函数 4 5 6 7 8信号和槽转为可调用对象的connect函数 9转到槽函数 1 将信号连接到另一