新手学QT的时候往往不知道在别的类处理获得的信息,怎么发送给ui界面,并且控制ui界面的控件。
首先我们先看下这两个ui界面,当主界面点击显示处理结果时出现第2个界面。
点击显示处理结果出现第2个ui界面
在这里插入图片描述
第2个界面可以通过右键源文件添加新文件获得,选择QT设计师界面类在这里插入图片描述
根据具体情况选择
在这里插入图片描述
接下来我们看源码
主窗口头文件:

#ifndef VMWINDOW_H
#define VMWINDOW_H

#include "resultshow.h"
#include "resultdb.h"
#include <QWidget>

namespace Ui {
class VMWindow;
}

class VMWindow : public QWidget
{
    Q_OBJECT

public:
    explicit VMWindow(QWidget *parent = 0);
    ~VMWindow();
    void set_pos_result(const QString &bardata);
    void send_bar_message(const QString &bardata);
private slots:
    void on_pushButton_clicked();

private:
    Ui::VMWindow *ui;
    ResultShow *resultui;
};

#endif // VMWINDOW_H

主窗口cpp文件:

VMWindow::VMWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::VMWindow)
{
    ui->setupUi(this);
    resultui = new ResultShow();
}
VMWindow::~VMWindow()
{
    delete resultui;
    delete ui;
}
void VMWindow::on_pushButton_clicked()
{
    //resultui = new ResultShow();
    resultui->show();

}

从代码可以看出,我们可以在主窗口类的头文件里我们包含一个子窗口类,并在主窗口类的构造函数中初始化一个子窗口类,然后就通过窗口类自带的show()函数去显示第2个窗口啦。

至于主窗口怎么控制子窗口的控件呢?
第一步:我们可以在子窗口类里设置好控制控件的方法,需要什么参数需想好
第二步:通过QT信号与槽的机制,因为我们的信号是可以带参数的,可以用于传输在别的 类里处理获得的信息,然后通过connect绑定,每次发送信号时,ui界面就去获取参数,并执行相关的函数,从而达到控制界面控件的目的

int main(int argc, char *argv[])
{
    //QApplication a(argc, argv);
    GlobalApplication a(argc,argv);
    VMWindow w;
    w.show();
       /*想把GlobalApplication里的信息传递给resultshow界面,只需要关联主窗口vmwindow,在vmwindow类里有一个resultshow对象,然后
       通过resultshow对象调用相关的方法即可,不需要去操作私有控件,通过公有方法去设置私有控件*/ 
    QObject::connect(&a,&GlobalApplication::sendData,&w,&VMWindow::send_bar_message);
    return a.exec();
}
#ifndef VMWINDOW_H
#define VMWINDOW_H

#include "resultshow.h"
#include "resultdb.h"
#include <QWidget>

namespace Ui {
class VMWindow;
}

class VMWindow : public QWidget
{
    Q_OBJECT

public:
    explicit VMWindow(QWidget *parent = 0);
    ~VMWindow();
    void set_pos_result(const QString &bardata);
    void send_bar_message(const QString &bardata);
private slots:
    void on_pushButton_clicked();

private:
    Ui::VMWindow *ui;
    ResultShow *resultui;

};

#endif // VMWINDOW_H

因为resultui在vmwindow构造函数中已经初始化,在所以在vmwindow怎个cpp都能用,只需调用这个子窗口类的成员函数即可达到控制子窗口控件的目的

//主窗口
void VMWindow::send_bar_message(const QString &bardata)
{
     resultui->set_ui_barmes(bardata);
}
//子窗口
void ResultShow::set_ui_barmes(const QString &bardata)
{
    ui->barEdit->setText(bardata);
}

下面代码是一个全局监控类的头文件,重载了监控键盘事件,我们关注sendData信号和sendBarData函数即可

#ifndef GLOBALAPPLICATION_H
#define GLOBALAPPLICATION_H
#include <QObject>
#include <QApplication>
class GlobalApplication : public QApplication
{
    Q_OBJECT
public:
    //explicit GlobalApplication(QObject *parent = 0);
    explicit GlobalApplication(int& argc,char **argv);
    bool notify(QObject*,QEvent *);
    void setWindowInstance(QWidget *wnd);
    void sendBarData(const QString &bardata)
    {
        emit sendData(bardata);
    }
signals:
    void sendData(const QString &bar);
public slots:

private:
    QWidget *widget;
    QString barstr;

};
#endif // GLOBALAPPLICATION_H

每次获取到enter回车事件后,我们就吧扫码枪的信息发一条信号给主窗口,让主窗口去控制控件

#include "globalapplication.h"
#include <QKeyEvent>
#include <QDebug>
GlobalApplication::GlobalApplication(int &argc,char **argv):
QApplication(argc,argv)
{

}

void GlobalApplication::setWindowInstance(QWidget *wnd)
{
    widget = wnd;
}

bool GlobalApplication::notify(QObject *obj, QEvent *e)
{
    const QMetaObject* objMeta = obj->metaObject();
    QString clName = objMeta->className();
    if(clName == "QWidgetWindow")
    {
        if(e->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
            //扫描枪扫描后,模拟键盘输入一连串字符,最后输入enter,数字代表enter
            if(keyEvent->key() == 16777220)
            {
                sendBarData(barstr);
                barstr.clear();
            }//当输入的不是enter键的时候,把所有扫码枪输入字符累加形成条码信息
            else
            {
                //key不区分大小写,
                QString st=keyEvent->text();
                QString str_ascii = st;
                barstr +=str_ascii;
            }
         }

    }


    return QApplication::notify(obj,e);

}

写得有点乱 以后有空了再修改

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐