C++ 如何访问此变量Qt?
对不起,问题会很长。我不知道如何缩短这个。我是新来的。在C++中有一些经验,我认为我应该从QT开始,让我的程序图形化。我选择了单用户图书馆管理软件作为个人项目 我创建了一个book类来获取和设置书的名称、作者和uid。然后,我创建了一个library类来管理一个矢量书。它目前只能添加一本书,并以特定索引获取一本书 到目前为止,代码运行良好。但我随后尝试添加GUI 在mainwindow构造函数中,我刚刚向library类对象添加了两个预定义的图书。主窗口有三行编辑以显示每本书的名称、作者和uid。它有两个按钮“下一步”显示下一本书,“上一步”显示上一本书 我想要一个特写来增加这本书。因此,创建了“文件”菜单,并使用“设计”菜单添加了“添加书本”。我去吃角子老虎了 我想要的是创建第二个窗口,询问新书的名称、作者和uid。事实上,我的library类对象包含所有书籍的详细信息。如何访问该对象以便调用addBook()函数来添加该书C++ 如何访问此变量Qt?,c++,qt,qt5,qdialog,C++,Qt,Qt5,Qdialog,对不起,问题会很长。我不知道如何缩短这个。我是新来的。在C++中有一些经验,我认为我应该从QT开始,让我的程序图形化。我选择了单用户图书馆管理软件作为个人项目 我创建了一个book类来获取和设置书的名称、作者和uid。然后,我创建了一个library类来管理一个矢量书。它目前只能添加一本书,并以特定索引获取一本书 到目前为止,代码运行良好。但我随后尝试添加GUI 在mainwindow构造函数中,我刚刚向library类对象添加了两个预定义的图书。主窗口有三行编辑以显示每本书的名称、作者和uid
#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您更改了按钮的名称了吗?