2013-12-24 3 views
0

Привет, я сделал gui в дизайнере qt4 и хочу добавить пользовательские слоты с пользовательским классом. Проект легко компилируется без ошибок, но моя пользовательская функция не работает, что я делаю неправильно? Я покажу вам файл заголовка qt4, созданный для меня, и плохо показываю свой пользовательский файл, а также main.cpp .. сначала main.cppqt4 designer добавить пользовательский класс

Я пересмотрел свой код, вот что у меня есть сейчас добавили файл с именем sweetest.cpp и редактировал sweetest.h вот мой новый файл и ошибка я получаю ..

Первый main.cpp

#include "ui_sweetguiform.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QWidget *widget = new QWidget; 
    Ui::SweetGuiForm ui; 
    ui.setupUi(widget); 

    widget->show(); 
    return app.exec(); 
} 

теперь мой файл пользовательского заголовка sweetest.cpp

#include "sweetest.h" 
// trying to include the .moc file wouldnt work at all. 

теперь sweettest.h файл с моим кодом

#include "ui_sweetguiform.h" 

class SweetGuiForm : public QWidget 
{ 
    Q_OBJECT 
public: 
    SweetGuiForm(): ui(new Ui::SweetGuiForm) 
    { 
     ui->setupUi(this); 
    connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(on_buttonBox_accepted())); 
    } 

public slots: 
    void on_buttonBox_accepted() 
    { 
     ui.textEdit->setText(QString::number(23)); 

    } 

protected: 
    Ui::SweetGuiForm* ui; 
}; 

Здесь ошибка компиляции я получаю .. Я действительно застрял

In file included from sweetest.cpp:1: 
sweetest.h: In member function ‘void SweetGuiForm::on_buttonBox_accepted()’: 
sweetest.h:16: error: request for member ‘textEdit’ in ‘((SweetGuiForm*)this)->SweetGuiForm::ui’, which is of non-class type ‘Ui::SweetGuiForm*’ 
make: *** [sweetest.o] Error 1 

Я думаю, им все ближе

ответ

0

Хорошо, ребята, я понял это и думал, что я могу поделиться тем, что нашел. Во-первых, документация отличная в qt4.

Я нашел, что вы можете использовать конструктор qt4 для генерации файлов прослушивателя, сначала я выполнил его вне пользовательских слотов и создал ui_sweetgui2.h, то я могу открыть файл sweetgui2.h, сгенерированный первым компилятором, который я удалил, что qt4 вложил туда и поместил свои пользовательские слоты на этом этапе. проделал мою голову в течение нескольких часов .... дней. Итак, вот самое простое приложение на земле, но это заставило меня начать, вот и файлы и код, которые работали на меня, и документация в основном заставила меня щелкнуть дальше, что происходит.

main.cpp Пролив из документации только что изменил название класса «SweetGuiForm».

#include <QApplication> 
#include "sweetgui2.h" 
int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    SweetGuiForm sweetgui; 
    sweetgui.show(); 
    return app.exec(); 
} 

Следующая sweetgui2.cpp Моя первая попытка с ++ .. некрасиво, но работает. Но снова я нашел все о получении текста из textEdit и напечатал его в int в примере калькулятора и выполнил поиск toPlainText() в помощнике qt4. ниже, включая файл, в котором я буду определять новые слоты, которые в дальнейшем будут показаны ниже. желающий im смысл.

#include <QtGui> 
#include "sweetgui2.h" 
    SweetGuiForm::SweetGuiForm(QWidget *parent) 
: QWidget(parent) 
{ 
    ui.setupUi(this); 
} 

void SweetGuiForm::on_buttonBox_accepted() 
{ 
    QString stringamount = ui.textEdit->toPlainText(); 
    int digitamount = stringamount.toInt(); 
    ui.textEdit->setText(QString::number(25 + digitamount)); 
} 

Следующей sweetgui2.h один мы включили выше Мой пользовательский заголовочный файл с моим пользовательским слотом .... просто, как я сказал, из примера калькулятора и скручен лил .. вы получите его это не так, как выглядит, когда вы создаете его у дизайнера при первом компиляции, это после того, как я удалил почти все, что было там, и открыл пример калькулятора, а затем в учебном пособии, в котором показано, как сделать свой первый пользовательский слот.

#ifndef SWEETGUI2_H 
#define SWEETGUI2_H 
#include "ui_sweetgui2.h" 
class SweetGuiForm : public QWidget 
{ 
    Q_OBJECT 
public: 
SweetGuiForm(QWidget *parent = 0); 
private slots: 
    void on_buttonBox_accepted(); 
private: 
Ui::SweetGuiForm ui; 
}; 
#endif // SWEETGUI2_H 

Снова прямо из документации. Я использовал пример калькулятора для получения основного потока.

Следующая ui_sweetgui2.h Я включил этот файл, так как я пытался добавить свои слоты в sweetgui2.h, которая была сгенерирована qt4 Desinger. does not work guys ..so я скомпилировал сначала файл sweetgui2.h, который вы создаете с помощью конструктора, я перехожу в меню форм, а затем просматриваю код, где можно сохранить файлы заголовков. то, конечно, сохраните файл ui. и компиляция, то вы в конечном итоге с ui_sweetgui2.h файлом Wich выглядел sweetgui2.h сгенерированного дизайнером

#ifndef UI_SWEETGUI2_H 
#define UI_SWEETGUI2_H 

#include <QtCore/QVariant> 
#include <QtGui/QAction> 
#include <QtGui/QApplication> 
#include <QtGui/QButtonGroup> 
#include <QtGui/QDialogButtonBox> 
#include <QtGui/QHeaderView> 
#include <QtGui/QTextEdit> 
#include <QtGui/QWidget> 

QT_BEGIN_NAMESPACE 

class Ui_SweetGuiForm 
{ 
public: 
    QDialogButtonBox *buttonBox; 
    QTextEdit *textEdit; 

    void setupUi(QWidget *SweetGuiForm) 
    { 
     if (SweetGuiForm->objectName().isEmpty()) 
      SweetGuiForm->setObjectName(QString::fromUtf8("SweetGuiForm")); 
     SweetGuiForm->resize(486, 238); 
     buttonBox = new QDialogButtonBox(SweetGuiForm); 
     buttonBox->setObjectName(QString::fromUtf8("buttonBox")); 
     buttonBox->setGeometry(QRect(150, 200, 181, 26)); 
     buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); 
     textEdit = new QTextEdit(SweetGuiForm); 
     textEdit->setObjectName(QString::fromUtf8("textEdit")); 
     textEdit->setGeometry(QRect(150, 50, 221, 91)); 

     retranslateUi(SweetGuiForm); 
     QObject::connect(buttonBox, SIGNAL(rejected()), SweetGuiForm, SLOT(close())); 

     QMetaObject::connectSlotsByName(SweetGuiForm); 
    } // setupUi 

    void retranslateUi(QWidget *SweetGuiForm) 
    { 
     SweetGuiForm->setWindowTitle(QApplication::translate("SweetGuiForm", "SweetGuiBack", 0, QApplication::UnicodeUTF8)); 
    } // retranslateUi 

}; 

namespace Ui { 
    class SweetGuiForm: public Ui_SweetGuiForm {}; 
} // namespace Ui 

QT_END_NAMESPACE 

#endif // UI_SWEETGUI2_H 

Тогда я перекомпилированный снова с моими пользовательскими слотами и Shazam! теперь я могу начать изучать некоторые C++. спасибо за все намеки, ребята, между вами и документацией, которую я получил. надеюсь, что это поможет. Главное, на что обратить внимание, это то, что вещи включены. Я имею в виду мой . Sweetgui2.cpp файл содержит файл sweetgui2.h. который захватывает все мои вещи.

Моего sweetgui2.h файл включает ui_sweetgui2.h которым есть все вещи, дизайнер сделал, когда я сделал первую компиляцию. Main.cpp вызывает мой класс SweetGuiForm.

Как вы все можете видеть мои первые пару дней с C++, но это хорошая отправная точка. это заставило меня поместить основной поток в мой разум. qt4 помощник смотреть на него.. его хорошо объяснили, и примеры кажутся очень хорошими. ho ho ho ho веселый xmas. надеюсь, что мое объяснение поможет.

1

таким образом, что сигналы и слоты работают в том, что вы должны подключить сигнал к слоту. В вашем коде самый простой способ сделать это в конструкторе SweetGuiForm. Вам нужно добавить:

SweetGuiForm() : ui(new Ui::SweetGuiForm) { 
    ui->setupUi(this); 
    connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(on_buttonBox_accepted())); 
} 

Когда buttonBox излучает принятый сигнал все слоты, подключенные к нему будет называться.

обновление 1

При дальнейшем осмотре вашего кода, вы также отсутствуют макросы Qt, которые используются системой Qt MOC (мета-объектный компилятор) (http://qt-project.org/doc/qt-4.8/moc.html):

class SweetGuiForm : public QWidget 
{ 
    Q_OBJECT 
    public: 
    ... 
}; 

Вам также нужно нажать код через инструмент MOC. Он будет генерировать исходный файл, который должен быть включен в ваш источник. Насколько я помню, вы должны включить это в файл cpp; включение в заголовок проблематично. Следующий должен быть достаточно:

sweetguiform.cpp:

#include "suiteguiform.h" 
#include "sweetguiform.moc" 

обновления 2

О дальнейших дальнейших размышлениях, я забыл о функции автоматического подключения сигнала/слоте, когда вы называете свои слоты используя специальные имена (например, on_buttonBox_accepted). Есть сообщение в блоге только об этом: http://qtway.blogspot.com/2010/08/automatic-connections-using-qt-signals.html. Я не использовал его сам, поэтому я не могу прокомментировать его способность работать при использовании переменной члена ui, хотя я подозреваю, что она не работает в этой компоновке. Несмотря на это, вам все равно нужен макрос Q_OBJECT и MOC.

+0

hmmm до сих пор нехорошо ... плохо редактируйте мой вопрос, чтобы показать, что я сделал .. это правильно .. – Brett

+0

Я добавил код, где u sujested.и сгенерировал ошибку компиляции .. я не понимаю .. я сделал это правильно? – Brett

+0

это больше нравится? – Brett