Qt如何访问这个变量?
How to access this variable Qt?
抱歉,这个问题会很长。我不知道如何缩短这个。我是 Qt 的新手。有了一点 C++ 的经验,我想我应该从 Qt 开始,让我的程序图形化。我选择了一个单用户图书馆管理软件作为个人项目。
我做了一本书class来获取和设置书的名称、作者和uid。然后,我创建了一个图书馆 class 来管理图书向量。它可以添加目前只能添加一本书并在特定索引处获取一本书。
所以,代码目前运行良好。但我随后尝试添加 GUI。
在主window 构造函数中,我刚刚向图书馆class 对象添加了两本预定义的书籍。主要 window 有 3 行编辑显示每本书的名称、作者和 uid。它有两个按钮 "next" 显示下一本书和 "previous" 显示上一本书。
我想要添加图书的功能。因此,创建了文件菜单并使用设计菜单添加了添加书籍。我去了老虎机。
我想要的是创建第二个window来询问新书的名称、作者和uid。事实上,我的图书馆 class 对象包含所有书籍的详细信息。我如何访问该对象以调用 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
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();
}
Dialog.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
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?
}
}
这是显示的内容:
Your answer
我希望图书馆class中的addBook是将书添加到列表中。您可以创建一个连接,将如下所示的书籍详细信息从对话框传递到主窗口:-
在对话框中 class 创建一个信号,它将发送书籍的详细信息。例如在 Dialog.h in class 对话框中这样声明信号:-
signals:
void bookDetailsEntered(book b);
在Dialog.cpp中在on_pushButton_clicked()中发出这个信号:-
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());
emit bookDetailsEntered(b);
}
}
现在在 MainWindow.h 中声明一个插槽,它将像这样接收书籍的详细信息:-
private slots:
void onBookDetailsEntered(book b);
并在 MainWindow.cpp 中创建从 Dialog.h 中的信号到 Mainwindow 中的插槽的连接,如下所示:-
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_actionAdd_book_triggered() 中显示对话框。 IE。
d->show();
抱歉,这个问题会很长。我不知道如何缩短这个。我是 Qt 的新手。有了一点 C++ 的经验,我想我应该从 Qt 开始,让我的程序图形化。我选择了一个单用户图书馆管理软件作为个人项目。
我做了一本书class来获取和设置书的名称、作者和uid。然后,我创建了一个图书馆 class 来管理图书向量。它可以添加目前只能添加一本书并在特定索引处获取一本书。
所以,代码目前运行良好。但我随后尝试添加 GUI。
在主window 构造函数中,我刚刚向图书馆class 对象添加了两本预定义的书籍。主要 window 有 3 行编辑显示每本书的名称、作者和 uid。它有两个按钮 "next" 显示下一本书和 "previous" 显示上一本书。
我想要添加图书的功能。因此,创建了文件菜单并使用设计菜单添加了添加书籍。我去了老虎机。
我想要的是创建第二个window来询问新书的名称、作者和uid。事实上,我的图书馆 class 对象包含所有书籍的详细信息。我如何访问该对象以调用 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
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();
}
Dialog.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
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?
}
}
这是显示的内容: Your answer
我希望图书馆class中的addBook是将书添加到列表中。您可以创建一个连接,将如下所示的书籍详细信息从对话框传递到主窗口:-
在对话框中 class 创建一个信号,它将发送书籍的详细信息。例如在 Dialog.h in class 对话框中这样声明信号:-
signals:
void bookDetailsEntered(book b);
在Dialog.cpp中在on_pushButton_clicked()中发出这个信号:-
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());
emit bookDetailsEntered(b);
}
}
现在在 MainWindow.h 中声明一个插槽,它将像这样接收书籍的详细信息:-
private slots:
void onBookDetailsEntered(book b);
并在 MainWindow.cpp 中创建从 Dialog.h 中的信号到 Mainwindow 中的插槽的连接,如下所示:-
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_actionAdd_book_triggered() 中显示对话框。 IE。 d->show();