【问题标题】:How to access this variable Qt?如何访问这个变量 Qt?
【发布时间】:2018-04-02 05:49:01
【问题描述】:

抱歉,这个问题会很长。我不知道如何缩短这个。我是 Qt 的新手。有了一点 c++ 的经验,我想我应该从 Qt 开始,让我的程序图形化。我选择了一个单用户图书馆管理软件作为个人项目。

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

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

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

我想要一个功能来添加这本书。因此,创建了文件菜单并使用设计菜单添加了添加书。我去了插槽。

我想要的是创建第二个窗口来询问新书的名称、作者和 uid。事实上,我的图书馆类对象包含所有书籍的详细信息。我如何访问该对象以调用 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

主窗口.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();
}

对话框.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

对话框.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

【问题讨论】:

  • 你可以创建一个信号槽机制来调用你的主窗口中的一个函数来添加书籍。您可以将书籍详细信息作为参数传递给该函数
  • 无关:阅读三法则。
  • @eyllanesc,看看图片

标签: c++ qt qt5 qdialog


【解决方案1】:

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

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

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);
}

我希望我回答了你的问题。

【讨论】:

  • 非常感谢。让我试试这个。应该最有可能工作
  • @Hemil 你测试过吗?你确定这本书可以被信号使用吗?
  • 它显示了一个错误。未定义对“MainWindow::onBookDetailesEnteredBook(book)”的引用。当我点击它时,它会打开 moc_mainwindow.cpp @Hidd3N
  • 您的解决方案适用于@eyllanesc 提供的附加功能。但在运行时我收到此错误: QMetaObject::connectSlotsByName: No matching signal for on_pushButton_clicked()
  • @Hemil 你把按钮的名字改了吗?
【解决方案2】:

您需要在 on_actionAdd_book_triggered() 中显示对话框。 IE。 d->show();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多