在C++中将数据从Qt传递到基元类型

Passing Data From Qt To Primitive Types In C++

本文关键字:类型 Qt C++ 数据      更新时间:2023-10-16

我在用Qt编写的GUI上有一个按钮。这个按钮的作用是将整数值增加2。然后,这个新值会显示在同一GUI上的小部件中。我的目标是将这个递增的值传递给一个基元数据类型,在本例中是int

递增按钮允许您递增显示在GUI上的值,这意味着我在这两个GUI元素之间使用了SIGNAL和SLOT协议。

SIGNAL和SLOT与动作侦听器协议不同,因此,我似乎无法更新每次单击鼠标时存储该值的int。我需要能够在每次用户单击GUI上的增量按钮时更新这个int值。。。。最后的目标是将这个值传递给用C++编写的另一个数学函数。下面是我试图弄清楚如何做到这一点的尝试。注意,在GUI运行的整个过程中,只打印出一个值,即存储在outVal中的初始值。如果这使用了动作侦听器,那么这将不是问题。所以我的问题是,如何在每次鼠标点击时更新outVal。。。谢谢

#include <QApplication>
#include <QGridLayout>
#include <QLabel>
#include <QSpinBox>
#include <string>
#include <stdlib.h>
#include <stdio.h>

#define MIN_WIDTH 350
#define MIN_HEIGHT 300
int main(int argc, char ** argv){
int outVal = 99;
QApplication a(argc, argv);
QWidget window;
window.setMinimumSize(MIN_WIDTH,MIN_HEIGHT);

QVBoxLayout * mainPlatter = new QVBoxLayout(&window);
QSpinBox * spinBox = new QSpinBox;

spinBox->setRange(1,77);
spinBox->setSingleStep(2);



QLabel * label = new QLabel("1");


mainPlatter->addWidget(spinBox);;
mainPlatter->addWidget(label);
QObject :: connect( spinBox, SIGNAL(valueChanged(int)) , label, SLOT(setNum(int)));

outVal = spinBox->value();
window.show();

printf("%dn",outVal);
return a.exec();

return 0;
}

编辑:在我得到建议后,这就是我尝试的方法

#include <iostream>
#include <QObject>
using namespace std;
class Counter : public QObject{
Q_OBJECT
signals:
void valueChanged(int newValue);
public:
Counter(){
m_value = 1;
}
int value() const {
return m_value;
}
public slots:
void setValue(int value);
private:
int m_value;
};
void Counter::setValue(int value){ 
if(value != m_value){ 
m_value = value;
emit valueChanged(value);
}
}
int main(void){
Counter a, b;
QObject :: connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
a.setValue(7);
cout << "a.setValue(7) " << endl;
cout << "(a.value, b.value) = " << a.value() << b.value() << endl;

return 0;
}

这些是我的错误

g++-c-m64-管道-O2-墙壁-W-D_REENTRANT-fPIE-DQT_NO_DEBUG-DQT_WIDGETS_LIB-DQT_GUI_LIB-DQT_CORE_LIB-I/usr/share/qt5/mkspecs/linux-g++-64-I-I.-I/usr/include/qt5-I/usr/include/qt5/QtWidgets-I/usr\include/qt5/QtGui-I/usr/include/qt5/QT核心-I-o example1.o example1.cppg++-m64-Wl,-O1-o gui1示例1.o-L/usr/X11R6/lib64-lQt5Widgets-L/usr/lib/x86_64-linux-gnu-lQt5Gui-lQt5Core-lGL-lpthreadexample1.o:在函数Counter::setValue(int)': example1.cpp:(.text+0x9): undefined reference to中计数器::valueChanged(int)'示例1.o:在函数main': example1.cpp:(.text.startup+0x25): undefined reference to中,计数器的vtableexample1.cpp:(.text.startup+0x94):对"Counter::valueChanged(int)"的未定义引用collect2:错误:ld返回1退出状态make:*[gui1]错误1

仅供参考;我运行了"qmake-project",然后是"qmake",然后又是"make"。

编辑:最终工作版本!这个故事的寓意是,使用单独的c++文件中的头文件、函数定义和驱动程序将所有内容都放在适当的位置,使用QT会让生活变得更轻松。这里的具体问题是MOC没有运行,因为驱动程序(main)和QObject类在同一个文件中。

//function.h
#ifndef FUNCTION_H
#define FUNCTION_H
#include <QObject>
class Counter : public QObject {
Q_OBJECT
public:
Counter(){
m_value = 1;
}
int value() const {
return m_value;
}
public slots:
void setValue(int value);
signals:
void valueChanged(int newValue);
private:
int m_value;
};
#endif
//function.cpp
#include "function.h"
void Counter :: setValue(int value){ 
if(value != m_value){ 
m_value = value;
emit valueChanged(value);
}
}
//main.cpp
#include <iostream>
#include <QObject>
#include "function.h"
using namespace std;
int main(void){
Counter a, b;
QObject :: connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int)));
a.setValue(7);
cout << "a.setValue(7) " << endl;
cout << "(a.value, b.value) = " << a.value() << b.value() << endl;

return 0;
}

递增按钮允许您递增GUI上显示的值,这意味着ive(原文如此)在这两个GUI元素之间使用了SIGNAL和SLOT协议

这就是问题所在。您应该做的是将任何数据模型与其视觉表示分离。如果您将数据存储在一个类中,我们称之为Model,然后将按钮连接到Model类中的插槽,插槽函数可以更新其值,然后发出信号更新数据视图。

例如:

class Model : public QObject
{
Q_OBJECT
signals:
// connect this signal to the spin box setValue slot
void UpdateView(int value);
public slots:
// connect this slot to the push button released() signal
void IncrementValue();
private:
int m_value;
}
void Model::IncrementValue()
{
m_value += 2;
emit UpdateView(m_value);
}

有一种伟大的设计模式扩展了这一点,称为MVC(模型-视图-控制器)