在Qt中实现多窗口通信

2022/05/16 Qt 共 2101 字,约 7 分钟

在Qt中实现多窗口通信

之前一直在找关于多窗口通信之间的方案,因为我现在的项目就是一个广播,然后桌面置顶最上方会有一个提示栏,提示你当前的直播情况,点击广播的头像的最小化按钮后头像消失,title出现,点击title的 展开之后,title消失,头像出现,这显示不可能是通过一ui实现的,肯定至少用到了两个ui,所以之前找了一下这个qt多窗口之间的通信方案,但是很多写的都是所谓父子窗口之间的通信,这明显两个按钮之间 是两个单独的类,那该怎么做呢?

其实在这里要搞清楚qt的ui是怎么运作的

拿这个TitleAbove来举例子:

class TitleAbove : public QWidget {
  Q_OBJECT

public:
  TitleAbove(QWidget *parent = Q_NULLPTR);
private:
  Ui::TitleAbove ui;
};

这个就是我给Title的类,而其中引用的Ui文件也是对应的ui_TitleAbove.h

如果我需要在另一个类LBD_VideoMeeting_VisualBroadCast想要引用并打开这个类该如何实现呢?

只需要在LBD_VideoMeeting_VisualBroadCast.h的LBD_VideoMeeting_VisualBroadCast类中声明一个TitleAbove tta; 令其成为一个子窗口即可,反正两个窗口并不是实质上独立的,而是其中一个关闭,两个窗口一起关闭 而这个步骤可以通过SIGNAl和SLOT来完成。

写一个实例: .h文件 #pragma once

    #include <QtWidgets/QMainWindow>
    #include "ui_ConnectionTest.h"
    #include "qdebug.h"
    #include"ui_MainWindow.h"
    class ConnectionTest : public QMainWindow
    {
        Q_OBJECT

    public:

        ConnectionTest(QWidget *parent = Q_NULLPTR);

    private:
        Ui::ConnectionTestClass ui;


    public slots:
        void wirtedebug();
        void on_pushButton_clicked();

    signals:
        void CSignal();

    };

    class MainWindow :public QMainWindow {
        Q_OBJECT

    public:
        MainWindow(QWidget *parent = Q_NULLPTR);
        ConnectionTest *ct = new ConnectionTest();

        public slots:
        void printdebug();
    signals:
        void MSignals();
    private:
        Ui::MainWindow ui;

        private slots:
        void on_pushButton_clicked();


    };

.cpp文件

    #include "ConnectionTest.h"

    ConnectionTest::ConnectionTest(QWidget *parent) : QMainWindow(parent) {
        ui.setupUi(this);
    }

    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
        ui.setupUi(this);
        ct->show();
        connect(this, SIGNAL(MSignals()), ct, SLOT(wirtedebug()));
        connect(ct, SIGNAL(CSignal()), this, SLOT(printdebug()));
    }
    void MainWindow::printdebug() {
        qDebug() << "MainWindow slot";
    }
    void MainWindow::on_pushButton_clicked() {
        emit MSignals();
    }

    void ConnectionTest::wirtedebug() {

        qDebug() << "Connectiontest slot";
    }

    void ConnectionTest::on_pushButton_clicked()
    {
        emit CSignal();
    }

反思

本次开发中出现了四个问题

一、最开始在vs中进行定义的时候并不是定义的指针,而是单纯地定义了一个对象,但是connect函数中并不能引入一个对象,只能引入指针,所以不管怎么引入对象,也找不到对应的信号函数。

二、在写widget的构造函数时,忘记在结尾加上:widget(parent)了。这导致了vs识别不到我这个构造函数是继承类的,而是一个普通的构造函数,这导致了vs无法识别。

三、在实际编写中,即使上述两项都写对了,你在 SIGNAL()的括号中写入信号函数,仍然是不会进行联想,只能你自己去写,然后不报错,仅此而已。

四、发送信号函数signal 和 槽函数 slot 要写对,它联想的 不一定是对的,甚至可能是错的,vs对 qt 的支持 其实不太理想。

文档信息

Search

    Table of Contents