Manipuler qt ui avec différents fichiers source
-
13-12-2019 - |
Question
J'ai cherché quelques heures maintenant mais je ne suis pas capable de trouver une solution.
Ma configuration est la suivante:
Widget.h
Widget.cpp
Widget.ui
Function.h
Function.cpp
J'ai écrit une fonction dans ma fonction.CPP qui ajoute des entrées à un QListWidget dans mon widget.ui. C'est juste un projet d'essai et d'erreur:
- J'ai déjà inclus widget.h et ui_widget.h afin que je puisse accéder aux classes.
- Le widget est le modèle QWidget que vous pouvez créer avec le QTDesigner.
- Il y a un QListwidget et un QButton.
Si je clique sur le qbutton, il appelle la fonction de fonction.cpp, qui ajoutera un élément au QListWidget.
Dois-je écrire une fente personnalisée pour cela ou y a-t-il un autre moyen?
EDIT:
comme demandé, voici le code.
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
namespace Ui {
class myWidget;
}
class myWidget : public QWidget
{
Q_OBJECT
public:
explicit myWidget(QWidget *parent = 0);
~myWidget();
private slots:
void on_pushButton_clicked();
private:
Ui::myWidget *ui;
};
#endif // MYWIDGET_H
le mywodget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
myWidget::myWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::myWidget)
{
ui->setupUi(this);
}
myWidget::~myWidget()
{
delete ui;
}
void myWidget::on_pushButton_clicked()
{
ui->listWidget->addItem("Some Item");
}
le mywidget.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>myWidget</class>
<widget class="QWidget" name="myWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QListWidget" name="listWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>256</width>
<height>192</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>110</x>
<y>240</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>add</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
Les fonctions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
class Functions
{
public:
Functions();
};
#endif // FUNCTIONS_H
et les fonctions .CPP
#include "functions.h"
#include "myWidget.h" //there seems no effect between ui_mywidget.h and this one ...
Functions::Functions()
{
}
ive essayé d'ajouter
Ui::myWidget *ModUi = new myWidget;
ModUi->ui->listWidget->addItem("SomeItem");
J'ai essayé cela avec et sans q_Object dans la classe de fonctions dans différentes variations. J'étais très créatif dans ce cas ^^
J'espère que cela vous aidera à comprendre?
La solution
Essayez ceci:
class Functions; // Forward declaration
class myWidget : public QWidget
{
Q_OBJECT
public:
explicit myWidget(QWidget *parent = 0);
~myWidget();
private slots:
void on_pushButton_clicked();
private:
Ui::myWidget *ui;
Functions*fun; // member ptr
friend class Functions; // allow access to private members
};
et implémentation:
[...]
#include "Functions.h"
myWidget::myWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::myWidget),
fun(new Functions(this)) // initializer list
{
ui->setupUi(this);
}
myWidget::~myWidget()
{
delete ui;
delete fun; // we new'ed it so we have to delete it!
}
void myWidget::on_pushButton_clicked()
{
fun->doIt(); // call to the function
}
la fonction.h
[...]
class myWidget; // Forward declaration
class Functions
{
public:
Functions(myWidget *wid);
void doIt();
private:
myWidget *widget; // Member pointer to the main widget
};
et la fonction.cpp
[...]
#include "ui_mywidget.h"
#include "myWidget.h"
Functions::Functions(myWidget *wid):widget(wid) // init the ptr
{
}
void Function::doIt()
{
widget->ui->listWidget->addItem("SomeItem"); // add the items
}
Autres conseils
Vous devez probablement inclure «myWidget.h» et «ui_mywidget.h» dans votre fichier fonction.CPP.Vous avez besoin du premier à savoir ce que MyWidget est, afin d'accéder à sa variable membre de l'interface utilisateur.Vous avez besoin de la seconde pour savoir quelle est la variable d'interface utilisateur.
Quelque chose le long de ces lignes devrait fonctionner, bien que probablement pas comme vous attendez:
#include "functions.h"
#include "myWidget.h"
#include "ui_mywidget.h"
Functions::Functions()
{
// The following line creates a new widget, and does not use any existing
// widgets (like you probably expect it to).
myWidget *ModUi = new myWidget;
ModUi->ui->listWidget->addItem("SomeItem");
}