2016-07-08 11 views
0

저는 Qt를 처음 접했습니다. 약 두 달 전에 QWidgets 응용 프로그램을 시작했고 모든 것이 순조롭게 진행되었습니다. 이제 나는 진짜 문제가있다. 내 C++ 로직을 Qml Ui에 통합해야한다. 내 QWidget 응용 프로그램 응용 프로그램과 Qml로 작성된 UI에서 내 소스 코드를 게시합니다. 내가해야 할 일은 Qml 통합 Ui로 응용 프로그램을 작동시키는 것입니다. 그것은 QWidgets와 잘 작동하지만 Qml에 그것을 통합하는 방법을 모른다. 나는 2 일 동안 그물을 찾고 있었지만 그 개념을 이해하지 못하고있다. Qml과 관련하여 완전한 놈이라는 사실을 감안할 때, 조언이 있으면 크게 환영 할 것입니다. 여기 Qt. Q ++ 통합

내 C++/QWidgets 버전입니다 :

헤더 : mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

class MainWindow : public QMainWindow 
    { 
Q_OBJECT 

public: 
MainWindow(QMainWindow *parent = 0); 
~MainWindow(); 
}; 

#endif // MAINWINDOW_H 

addressbook.h

#ifndef ADDRESSBOOK_H 
#define ADDRESSBOOK_H 
#include <QMainWindow> 
#include <QWidget> 
#include <QTextEdit> 
#include <QPushButton> 
#include <QObject> 
#include <QLineEdit> 
#include <QLabel> 
#include <QListWidget> 
#include <QFrame> 
#include <QList> 
#include <QGridLayout> 
#include <QString> 
#include <QStringList> 
#include <QKeyEvent> 
#include <QCoreApplication> 

class AddressBook4 : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit AddressBook4(QWidget *parent = 0); 
    ~AddressBook4(); 
    struct Details 
    { 
     QString name; 
     QString street; 
     QString number; 
     QString notes; 
    }; 

signals: 

public slots: 

private slots: 
    void add(bool); 
    void onListWidgetItemClicked(const QModelIndex &index); 
    void importSql (bool); 
    void exportSql (bool); 

private: 
    QTextEdit *m_pNotesTextEdit; 
    QTextEdit *m_pDetailsTextEdit; 

    QLineEdit *m_pNameLineEdit; 
    QLineEdit *m_pStreetLineEdit; 
    QLineEdit *m_pNumberLineEdit; 

    QListWidget *m_pListWidget; 

    QPushButton *m_pAddbutton; 
    QPushButton *m_pImportbutton; 
    QPushButton *m_pExportbutton; 

    QFrame *m_pFrame; 
    QLabel *m_pAddAdress; 
    QLabel *m_pName; 
    QLabel *m_pStreet; 
    QLabel *m_pNumber; 
    QLabel *m_pDetails; 
    QLabel *m_pNotes; 
    QLabel *m_pAddresses; 

    QGridLayout *m_pGrid; 
    QString *line; 
    QListWidgetItem *item; 

    QList<Details> m_detailsList; 
}; 

#endif // ADDRESSBOOK_H 

CPP 파일 : mainwindow.cpp

#include "mainwindow.h" 
#include "addressbook.h" 

MainWindow::MainWindow(QMainWindow *parent) 
    : QMainWindow(parent) 
{ 
    AddressBook4 *addressbook4 = new AddressBook4(this); 
    setCentralWidget(addressbook4); 
} 

MainWindow::~MainWindow() 
{ 
} 
,451,515,

addressbook.cpp

#include "addressbook.h" 
#include "mainwindow.h" 
#include <QMainWindow> 
#include <QWidget> 
#include <QMessageBox> 
#include <QTextEdit> 
#include <QLabel> 
#include <QLineEdit> 
#include <QListWidget> 
#include <QGridLayout> 
#include <QFrame> 
#include <QPushButton> 
#include <QTextStream> 
#include <QtCore> 
#include <QString> 
#include <QTextStream> 
#include <QFile> 
#include <QStringList> 
#include <QtSql> 
#include <QCoreApplication> 
#include <QApplication> 

#define FISIER_ADRESE "C:\\Users\\max\\Documents\\workspace\\AddressBook5\\Addresses.db" 

AddressBook4::AddressBook4(QWidget *parent) 
    : QWidget(parent) 
{ 
    m_pGrid = new QGridLayout(this); 

    m_pFrame = new QFrame(this); 
    m_pGrid->addWidget(m_pFrame,1,0,8,4); 
    m_pFrame->setFrameShape(QFrame::StyledPanel); 

    m_pAddAdress = new QLabel("Add address", this); 
    m_pGrid->addWidget(m_pAddAdress,1,2); 
    m_pAddAdress->setAlignment(Qt::AlignRight | Qt::AlignVCenter); 

    m_pName = new QLabel("Name:", this); 
    m_pGrid->addWidget(m_pName,2,1); 
    m_pName->setAlignment(Qt::AlignLeft | Qt::AlignTop); 

    m_pNameLineEdit = new QLineEdit(this); 
    m_pGrid->addWidget(m_pNameLineEdit,2,2); 

    m_pStreet = new QLabel("Street:", this); 
    m_pGrid->addWidget(m_pStreet,3,1); 
    m_pStreet->setAlignment(Qt::AlignLeft | Qt::AlignTop); 

    m_pStreetLineEdit = new QLineEdit(this); 
    m_pGrid->addWidget(m_pStreetLineEdit,3,2); 

    m_pNumber = new QLabel("Number:", this); 
    m_pGrid->addWidget(m_pNumber,4,1); 
    m_pNumber->setAlignment(Qt::AlignLeft | Qt::AlignTop); 

    m_pNumberLineEdit = new QLineEdit(this); 
    m_pGrid->addWidget(m_pNumberLineEdit,4,2); 
    m_pNumberLineEdit->setFixedWidth(50); 

    m_pNotes = new QLabel("Notes:", this); 
    m_pGrid->addWidget(m_pNotes,6,1); 
    m_pNotes->setAlignment(Qt::AlignLeft | Qt::AlignTop); 

    m_pNotesTextEdit = new QTextEdit(this); 
    m_pGrid->addWidget(m_pNotesTextEdit,6,2); 

    m_pAddbutton= new QPushButton ("Add",this); 
    m_pGrid->addWidget(m_pAddbutton, 7,2,Qt::AlignBaseline); 

    m_pImportbutton= new QPushButton ("ImportSql",this); 
    m_pGrid->addWidget(m_pImportbutton, 7,4,Qt::AlignBaseline | Qt::AlignLeft); 
    m_pImportbutton->setFixedWidth(80); 
    m_pImportbutton->setShortcut(QKeySequence(Qt::Key_Insert)); 

    m_pExportbutton= new QPushButton ("ExportSql",this); 
    m_pGrid->addWidget(m_pExportbutton, 7,4,Qt::AlignBaseline | Qt::AlignRight); 
    m_pExportbutton->setFixedWidth(80); 

    m_pAddresses = new QLabel("Addresses", this); 
    m_pGrid->addWidget(m_pAddresses,1,4); 
    m_pAddresses->setAlignment(Qt::AlignRight | Qt::AlignVCenter); 

    m_pListWidget = new QListWidget(this); 
    m_pGrid->addWidget(m_pListWidget,2,4,3,1); 

    m_pDetails = new QLabel("Details", this); 
    m_pGrid->addWidget(m_pDetails,5,4); 
    m_pDetails->setAlignment(Qt::AlignRight | Qt::AlignVCenter); 

    m_pDetailsTextEdit = new QTextEdit(this); 
    m_pGrid->addWidget(m_pDetailsTextEdit,6,4); 
    m_pDetailsTextEdit->setReadOnly(true); 

    setLayout(m_pGrid); 

    connect(m_pAddbutton, SIGNAL(clicked(bool)), 
      this, SLOT(add(bool))); 
    connect(m_pListWidget, SIGNAL(clicked(QModelIndex)), 
      this, SLOT(onListWidgetItemClicked(const QModelIndex))); 
    connect(m_pImportbutton, SIGNAL(clicked(bool)), 
      this, SLOT(importSql(bool))); 
    connect(m_pExportbutton, SIGNAL(clicked(bool)), 
      this, SLOT(exportSql(bool))); 

} 

//Reads the user imput data from m_pNameLineEdit, m_pStreetLineEdit, m_pNumberLineEdit, 
//m_pNotesiTextEdit and creates a new QListWidget item every time when clicked. 
void AddressBook4::add(bool) 
{ 
    if ((m_pNameLineEdit->text().isEmpty()) || (m_pStreetLineEdit->text().isEmpty()) 
     || (m_pNumberLineEdit->text().isEmpty()) || (m_pNotesTextEdit->toPlainText().isEmpty())) 
    { 
     QMessageBox::warning(this, "Warning", "You need to complete all the fields"); 
    } else { 
     int index = m_pListWidget->count(); 
     m_pListWidget->addItem("address " + QString::number(index)); 

     Details detail; 
     detail.name = m_pNameLineEdit->text(); 
     detail.street = m_pStreetLineEdit->text(); 
     detail.number = m_pNumberLineEdit->text(); 
     detail.notes = m_pNotesTextEdit->toPlainText(); 

     m_detailsList.append(detail); 
    } 
} 

//Prints the data from every QListWidgetItem in the m_pDetailsTextEdit when clicked 
void AddressBook4::onListWidgetItemClicked(const QModelIndex &index) 
{ 
    m_pDetailsTextEdit->clear(); 
    m_pDetailsTextEdit->append("Name: " + m_detailsList.at(index.row()).name); 
    m_pDetailsTextEdit->append("Street: " + m_detailsList.at(index.row()).street); 
    m_pDetailsTextEdit->append("Nr.: " + m_detailsList.at(index.row()).number); 
    m_pDetailsTextEdit->append("Notes: " + m_detailsList.at(index.row()).notes); 
} 

//Imports data from the Sql database and attributes it to QListWidget items 
void AddressBook4::importSql(bool) 
{ 
    QSqlDatabase my_db = QSqlDatabase::addDatabase("QSQLITE"); 
    my_db.setDatabaseName(FISIER_ADRESE); 
    my_db.open(); 

    qDebug() << "Connected to database..." ; 

    QSqlQuery my_qry("SELECT * FROM Addresses"); 
    int idx_Name = my_qry.record().indexOf("Name"); 
    int idx_Street = my_qry.record().indexOf("Street"); 
    int idx_Number = my_qry.record().indexOf("Number"); 
    int idx_Notes = my_qry.record().indexOf("Notes"); 
    while (my_qry.next()) { 
     Details detail; 
     detail.name = my_qry.value(idx_Name).toString(); 
     //qDebug() << detail.name; 
     detail.street = my_qry.value(idx_Street).toString(); 
     //qDebug() << detail.street; 
     detail.number = my_qry.value(idx_Number).toString(); 
     //qDebug() << detail.number; 
     detail.notes = my_qry.value(idx_Notes).toString(); 
     //qDebug() << detail.notes <<"\n"; 
     m_detailsList.append(detail); 
     int index = m_pListWidget->count(); 
     m_pListWidget->addItem("address " + QString::number(index)); 
    } 
} 

//Reads through every QlistWidget item and inserts the containing data into the Sql database 
void AddressBook4::exportSql(bool) 
{ 
    QSqlDatabase my_db = QSqlDatabase::addDatabase("QSQLITE"); 
    my_db.setDatabaseName(FISIER_ADRESE); 

    if (!my_db.open()) { 
     QMessageBox::warning(this, "Warning", "Cannot connect to the database"); 
    } else { 
     qDebug() << "Connected to database..."; 
     QSqlQuery my_qry; 
     my_qry.prepare("CREATE TABLE IF NOT EXISTS Addresses (Name QSTRING, " 
         "Street QSTRING, Number QSTRING, Notes QSTRING)"); 
      if(!my_qry.exec()) 
      qDebug() << my_qry.lastError(); 
      else 
      qDebug() << "Table created!"; 

      for (int row = 0; row < m_pListWidget->count(); ++row) { 
       item = m_pListWidget->item(row); 
       Details detail = m_detailsList.at(row); 

      my_qry.prepare("INSERT INTO Addresses (Name, Street, Number, Notes) " 
          "VALUES (:Name, :Street, :Number, :Notes)"); 
      my_qry.bindValue(":Name", detail.name); 
      my_qry.bindValue(":Street", detail.street); 
      my_qry.bindValue(":Number", detail.number); 
      my_qry.bindValue(":Notes", detail.notes); 
      if(!my_qry.exec()) 
       qDebug() << my_qry.lastError(); 
      else 
       qDebug() << "Inserted!"; 
     } 
    } 

} 

AddressBook4::~AddressBook4() 
{ 
} 

MAIN.CPP

#include <QApplication> 
#include "addressbook.h" 
#include "mainwindow.h" 
#include <QMainWindow> 
#include <QWidget> 
#include <QTextStream> 
#include <QString> 
#include <QTextStream> 
#include <QFile> 
#include <QStringList> 
#include <QtCore> 
#define STYLE_SHEET "C:\\Users\\max\\Documents\\workspace\\AddressBook4\\stylesheet.css" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MainWindow w; 
    w.setWindowTitle("AddressBook4"); 
    w.show(); 

    //QFile file (STYLE_SHEET); 
    //if (file.open(QFile::ReadOnly | QFile::Text)) { 
     // QTextStream in(&file); 
     //QString styleStr = in.readAll(); 
     //qDebug() << styleStr; 
     //file.close(); 
     //a.setStyleSheet(styleStr); 
    //} 

    return a.exec(); 
} 

그리고 지금은 내 QtQuick 버전을 게시 할 예정입니다.

헤더 : buttons.h

#ifndef BUTTONS_H 
#define BUTTONS_H 

#include <QObject> 
#include <QDebug> 

class Buttons : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Buttons(QObject *parent = 0); 

public slots: 
    void addClicked(const QStringList &in); 
    void exportClicked(); 
    void importClicked(); 
}; 

#endif // BUTTONS_H 

CPP 파일 : MAIN.CPP

#include <QApplication> 
#include <QQmlApplicationEngine> 
#include "buttons.h" 
#include <QQmlContext> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    Buttons buttons; 

    engine.rootContext()->setContextProperty("buttons", &buttons); 

    return app.exec(); 
} 

buttons.cpp

#include "buttons.h" 
#include <QApplication> 
#include <QObject> 
#include <QString> 
#include <QDebug> 

Buttons::Buttons(QObject *parent) : 
    QObject(parent) 
{ 
} 
void Buttons::addClicked(const QStringList &in) 
{ 
    qDebug() << in; 
} 

void Buttons::exportClicked() 
{ 
    qDebug() << "Works"; 
} 

void Buttons::importClicked() 
{ 
    qDebug() << "Works"; 
} 

그리고 내 main.qml 파일

C에서
+2

너무 많은 코드를! 더 구체적인 질문을 할 수 있습니까 : 시도한 것은 무엇이고 실제로 붙어있는 것은 무엇입니까? – LordWilmore

+0

모델을 사용하여 UI (위젯 또는 QML 기반)에 데이터를 표시하려고합니다. [이 질문에 대한 모델 및 QML] (http://stackoverflow.com/q/18616497/1329652) 및 [이 관련 질문] (http://stackoverflow.com/q/19324641/1329652) 및 [this 하나] (http://stackoverflow.com/a/19302329/1329652). –

+0

적어도, 포함하고있는 수많은 모듈을 의존성없이 사용중인 모듈의 포함으로 대체하십시오. 대부분의 경우'#include '과'#include '만 필요합니다.당신의 포함은 중복으로 가득 차서, 이유없이 코드를 부풀립니다. –

답변

1

++ 당신은 당신이 슬롯을 호출 할 수 있습니다 QML에서 QML

에서
class MyQuickView : public QQuickView { 
    MyQuickView(){ 
    rootContext()->setContextProperty('mySelf',  this); 
    rootContext()->setContextProperty('myProperty', 5); 
    setSource(QUrl.fromLocalFile(myQmlFile.qml)); 
    mySignal.connect 
    } 

    public slots: 
    void mySlot(int i); 
}; 

를 사용하고 당신이 C를 연결하는 방법을 찾을 수있는 특성 여기

Item { 
    Button { 
    onClicked: mySelf.mySlot(mySelf.myProperty); 
    } 
} 

을 읽을 수있는 속성을 정의 할 수 있습니다 ++ QML 슬롯에 신호 :

https://stackoverflow.com/a/8840945/264359