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?

Était-ce utile?

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");
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top