Манипулирование Qt UI с разными исходными файлами

StackOverflow https://stackoverflow.com//questions/9694474

Вопрос

Я искал несколько часов, но я не могу найти решение.

Моя настройка выглядит следующим образом:

Widget.h
Widget.cpp
Widget.ui
Function.h
Function.cpp
.

Я написал функцию в моей функции .CPP, которая добавляет некоторые записи в QListWidget в моем виджете .ui. Это просто пробный и ошибка проекта:

    .
  • Я уже включал Widget.h и ui_widget.h, чтобы я мог получить доступ к классам.
  • Виджет - это шаблон Qwidget, который вы можете создать с помощью QTDesigner.
  • В нем есть Qlistwidget и qbutton.

Если я нажму qbutton, то он вызывает функцию в функции .CPP, которая добавит элемент в QListWidget.

Нужно ли написать пользовательский слот для этого или есть другой путь?


Редактировать:

Как запрошено, вот код.

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
.

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

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>
.

Функции .h

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

class Functions
{
public:
    Functions();
};

#endif // FUNCTIONS_H
.

и функции .cpp

#include "functions.h"
#include "myWidget.h" //there seems no effect between ui_mywidget.h and this one ...

Functions::Functions()
{
}
.

Ive пытался добавить

Ui::myWidget *ModUi = new myWidget;
ModUi->ui->listWidget->addItem("SomeItem");
.

Я попробовал это с Q_Object в классе функций в разных вариациях. Я был очень креативным в этом случае ^^

Я надеюсь, что это поможет понять?

Это было полезно?

Решение

Попробуйте:

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
};
.

и реализация:

[...]
#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
}
.

Функция .h

[...]

class myWidget; // Forward declaration

class Functions
{
public:
    Functions(myWidget *wid);
    void doIt();
private:
    myWidget *widget; // Member pointer to the main widget
};
.

и функция.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
}
.

Другие советы

Вам, вероятно, нужно включить как «mywidget.h», так и «ui_mywidget.h» в файле функций.CPP.Вам нужна первая, кто знает, что такое MyWidget, чтобы получить доступ к вариабе элементов пользовательского интерфейса.Вам нужна вторая, чтобы узнать, что содержит переменную интерфейса UI.

что-то вдоль этих строк должно работать, хотя, вероятно, не так, как вы ожидаете:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top