Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问此变量Qt?_C++_Qt_Qt5_Qdialog - Fatal编程技术网

C++ 如何访问此变量Qt?

C++ 如何访问此变量Qt?,c++,qt,qt5,qdialog,C++,Qt,Qt5,Qdialog,对不起,问题会很长。我不知道如何缩短这个。我是新来的。在C++中有一些经验,我认为我应该从QT开始,让我的程序图形化。我选择了单用户图书馆管理软件作为个人项目 我创建了一个book类来获取和设置书的名称、作者和uid。然后,我创建了一个library类来管理一个矢量书。它目前只能添加一本书,并以特定索引获取一本书 到目前为止,代码运行良好。但我随后尝试添加GUI 在mainwindow构造函数中,我刚刚向library类对象添加了两个预定义的图书。主窗口有三行编辑以显示每本书的名称、作者和uid

对不起,问题会很长。我不知道如何缩短这个。我是新来的。在C++中有一些经验,我认为我应该从QT开始,让我的程序图形化。我选择了单用户图书馆管理软件作为个人项目

我创建了一个book类来获取和设置书的名称、作者和uid。然后,我创建了一个library类来管理一个矢量书。它目前只能添加一本书,并以特定索引获取一本书

到目前为止,代码运行良好。但我随后尝试添加GUI

在mainwindow构造函数中,我刚刚向library类对象添加了两个预定义的图书。主窗口有三行编辑以显示每本书的名称、作者和uid。它有两个按钮“下一步”显示下一本书,“上一步”显示上一本书

我想要一个特写来增加这本书。因此,创建了“文件”菜单,并使用“设计”菜单添加了“添加书本”。我去吃角子老虎了

我想要的是创建第二个窗口,询问新书的名称、作者和uid。事实上,我的library类对象包含所有书籍的详细信息。如何访问该对象以便调用addBook()函数来添加该书

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "library.h"
#include "dialog.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    library getLib();

private slots:
    void on_next_clicked();

    void on_previous_clicked();

    void on_actionAdd_book_triggered();

private:
    Ui::MainWindow *ui;
    int currentIndex;
    library l;

    Dialog* d;
};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括“library.h”
#包括“dialog.h”
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
库getLib();
专用插槽:
单击下一个按钮时无效();
上一次单击时无效();
在操作添加书本时无效已触发();
私人:
Ui::MainWindow*Ui;
int-currentIndex;
图书馆l;
对话*d;
};
#endif//main窗口
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    book b;
    b.setAuthor("Ruskin Bond");
    b.setName("The Jungle Book");
    b.setUid("123456789");

    l.addBook(b);

    b.setAuthor("Savi Sharma");
    b.setName("This is not your story");
    b.setUid("789456123");

    l.addBook(b);

    b = l.getBook(0);
    ui->lineEdit->setText(QString::fromStdString(b.getName()));
    ui->lineEdit_2->setText(QString::fromStdString (b.getAuthor()) );
    ui->lineEdit_3->setText(QString::fromStdString(b.getUid()));

    currentIndex = 0;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_next_clicked()
{
    ++currentIndex;

    if(currentIndex < l.numOfBooks())
    {
        book b;

        b = l.getBook(currentIndex);

        ui->lineEdit->setText(QString::fromStdString(b.getName()));
        ui->lineEdit_2->setText(QString::fromStdString(b.getAuthor()));
        ui->lineEdit_3->setText(QString::fromStdString(b.getUid()));
    }
}

void MainWindow::on_previous_clicked()
{
    --currentIndex;

    if(currentIndex >= 0)
    {
        book b;

        b = l.getBook(currentIndex);

        ui->lineEdit->setText(QString::fromStdString(b.getName()));
        ui->lineEdit_2->setText(QString::fromStdString(b.getAuthor()));
        ui->lineEdit_3->setText(QString::fromStdString(b.getUid()));
    }
}

void MainWindow::on_actionAdd_book_triggered()
{
    d = new Dialog(this);

    d->show();
}
#包括“mainwindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
b册;
b、 setAuthor(“罗斯金债券”);
b、 setName(“丛林书”);
b、 setUid(“123456789”);
l、 地址簿(b);
b、 setAuthor(“Savi Sharma”);
b、 setName(“这不是你的故事”);
b、 setUid(“789456123”);
l、 地址簿(b);
b=l.getBook(0);
ui->lineEdit->setText(QString::fromStdString(b.getName());
ui->lineEdit_2->setText(QString::fromStdString(b.getAuthor());
ui->lineEdit_3->setText(QString::fromStdString(b.getUid());
currentIndex=0;
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在下一步中单击()
{
++电流指数;
if(currentIndexlineEdit->setText(QString::fromStdString(b.getName());
ui->lineEdit_2->setText(QString::fromStdString(b.getAuthor());
ui->lineEdit_3->setText(QString::fromStdString(b.getUid());
}
}
void main window::在上一次单击时()
{
--电流指数;
如果(当前索引>=0)
{
b册;
b=l.getBook(当前索引);
ui->lineEdit->setText(QString::fromStdString(b.getName());
ui->lineEdit_2->setText(QString::fromStdString(b.getAuthor());
ui->lineEdit_3->setText(QString::fromStdString(b.getUid());
}
}
void main window::on_actionAdd_book_triggered()
{
d=新对话框(此对话框);
d->show();
}
对话.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H
\ifndef对话框
#定义对话框
#包括
名称空间用户界面{
类对话框;
}
类对话框:公共QDialog
{
Q_对象
公众:
显式对话框(QWidget*parent=0);
~Dialog();
专用插槽:
单击按钮时无效();
私人:
Ui::Dialog*Ui;
};
#endif//对话框
dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"
#include <QMessageBox>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    QString temp = ui->lineEdit->text(),
            temp_2 = ui->lineEdit_2->text(),
            temp_3 = ui->lineEdit_3->text();

    if(temp == "" || temp_2 == "" || temp_3 == "")
        QMessageBox :: warning(this, "Warning!", "One of the lines is empty");
    else
    {
        book b(temp.toStdString(), temp_2.toStdString(), temp_3.toStdString());

        //how do i add the book?
    }
}
#包括“dialog.h”
#包括“ui_dialog.h”
#包括
Dialog::Dialog(QWidget*父项):
QDialog(父级),
ui(新建ui::对话框)
{
用户界面->设置用户界面(此);
}
对话::~Dialog()
{
删除用户界面;
}
无效对话框::在按钮上单击()
{
QString temp=ui->lineEdit->text(),
temp_2=ui->lineEdit_2->text(),
temp_3=ui->lineEdit_3->text();
如果(临时=“”| |临时| 2=“”| |临时| 3=“”)
警告(这是“警告!”,“其中一行是空的”);
其他的
{
b册(临时toStdString(),临时2.toStdString(),临时3.toStdString());
//如何添加该书?
}
}
这就是出现的情况:

我希望图书馆中的addBook类将该书添加到列表中。您可以创建一个连接,将书本的详细信息从对话框传递到主窗口,如下所示:-

在Dialog类中创建一个信号,该信号将发送书本的详细信息。例如,在Dialog.h的类对话框中,声明如下信号:-

signals:
     void bookDetailsEntered(book b);
private slots:
     void onBookDetailsEntered(book b);
void MainWindow::on_actionAdd_book_triggered()
{
    d = new Dialog(this);

    connect(d,SIGNAL(bookDetailsEntered(book)),
           this,SLOT(onBookDetailsEntered(book)));

    // FYI, You can use Dialog here like Dialog d(in stack instead of heap). 
    // By this the d variable will get destroyed once the d is out of scope. 
    // Here you're creating the multiple instance of Dialog(each time when you show Dialog which will consume more memory)
}

void MainWindow::onBookDetailsEntered(book b)
{
   library.addBook(b);
}
在Dialog.cpp中,在按下按钮时发出此信号:-

现在在MainWindow.h中声明一个插槽,该插槽将接收以下书籍的详细信息:-

signals:
     void bookDetailsEntered(book b);
private slots:
     void onBookDetailsEntered(book b);
void MainWindow::on_actionAdd_book_triggered()
{
    d = new Dialog(this);

    connect(d,SIGNAL(bookDetailsEntered(book)),
           this,SLOT(onBookDetailsEntered(book)));

    // FYI, You can use Dialog here like Dialog d(in stack instead of heap). 
    // By this the d variable will get destroyed once the d is out of scope. 
    // Here you're creating the multiple instance of Dialog(each time when you show Dialog which will consume more memory)
}

void MainWindow::onBookDetailsEntered(book b)
{
   library.addBook(b);
}
在MainWindow.cpp中,创建从Dialog.h中的信号到MainWindow中插槽的连接,如下所示:-

signals:
     void bookDetailsEntered(book b);
private slots:
     void onBookDetailsEntered(book b);
void MainWindow::on_actionAdd_book_triggered()
{
    d = new Dialog(this);

    connect(d,SIGNAL(bookDetailsEntered(book)),
           this,SLOT(onBookDetailsEntered(book)));

    // FYI, You can use Dialog here like Dialog d(in stack instead of heap). 
    // By this the d variable will get destroyed once the d is out of scope. 
    // Here you're creating the multiple instance of Dialog(each time when you show Dialog which will consume more memory)
}

void MainWindow::onBookDetailsEntered(book b)
{
   library.addBook(b);
}

我希望我回答了你的问题

您需要在on_Action Add_book_triggered()中显示该对话框。即
d->show()

您可以创建一个信号槽机制来调用主窗口中的函数来添加书本。你可以将书本的详细信息作为参数传递给函数unrelated:阅读三的规则。@eyllanesc,多看看图片。让我试试这个。应该最有效probably@Hemil你测试过了吗?你确定那本书可以被信号使用吗?它显示了一个错误。未定义对“MainWindow::OnBookDetailsEnteredBook(book)”的引用。当我点击它时,它会打开moc_mainwindow.cpp@hidd3ny您的解决方案与@eyllanesc提供的添加项一起工作。但在运行时,我得到了以下错误:QMetaObject::connectSlotsByName:on_button_clicked()没有匹配的信号@Hemil您更改了按钮的名称了吗?