QT 不同类之间去控制ui界面的 ui控制ui
新手学QT的时候往往不知道在别的类处理获得的信息,怎么发送给ui界面,并且控制ui界面的控件。首先我们先看下这两个ui界面,当主界面点击显示处理结果时出现第2个界面。第2个界面可以通过右键源文件添加新文件获得,选择QT设计师界面类根据具体情况选择接下来我们看源码主窗口头文件:#ifndef VMWINDOW_H#define VMWINDOW_H#include "resultshow.h"#in
新手学QT的时候往往不知道在别的类处理获得的信息,怎么发送给ui界面,并且控制ui界面的控件。
首先我们先看下这两个ui界面,当主界面点击显示处理结果时出现第2个界面。
第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);
}
写得有点乱 以后有空了再修改
更多推荐
所有评论(0)