Qt从主窗口打开对话框

时间:2018-05-14 11:29:05

标签: c++ qt

所以我是Qt的新手,我试图创建一个简单的项目。我有一个使用Qt Designer创建的按钮和东西的MainWindow,一旦我点击其中一个按钮(它的名字是newBook),我需要打开另一个对话框。

我正在寻找一些解决方案,人们正在使用"去插槽......"选项,我的Visual Studio无法提供。所以我试着创建自己的功能。

MainWindow的名字是projekt2,我要打开的Dialog名为addBook。

projekt2.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_projekt2.h"

class projekt2 : public QMainWindow
{
    Q_OBJECT

public:
    projekt2(QWidget *parent = Q_NULLPTR);


private:
    Ui::projekt2Class ui;

protected slots:
    void projekt2::on_newBook_clicked();
};

projekt2.cpp

#include "stdafx.h"
#include "projekt2.h"
#include "addbook.h"

projekt2::projekt2(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

void projekt2::on_newBook_clicked()
{
    addBook book(this);
    book.setModal(true);
    book.exec();
}

addbook.h

#pragma once

#include <QDialog>
#include "ui_addbook.h"

class addBook : public QDialog
{
    Q_OBJECT

public:
    addBook(QWidget *parent = Q_NULLPTR);
    ~addBook();

private:
    Ui::addBook ui;
};

addbook.cpp

#include "stdafx.h"
#include "addbook.h"

addBook::addBook(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);
}

addBook::~addBook()
{
}

当我运行它时,没有错误。我的MainWindow打开了,但是当我点击按钮时,没有任何反应。我确定我错过了一些东西,比如连接,但我无法弄清楚。

我为一个微不足道的问题道歉,但我现在有点沮丧。谢谢你的耐心等待。

2 个答案:

答案 0 :(得分:0)

Qt信号/插槽系统有多种方式来执行连接。其中之一是基于匹配小部件名称和信号的自动连接,当插槽遵循此命名约定时: “on_”+ widgetName +“_”+ signalName();

但为了实现这一点,你必须使用格式良好的头文件提供Qt元编译器,因此从on_newButton_clicked()槽的声明中删除'projekt2 ::'前缀。

您还可以使用Qt connect()显式连接信号/插槽;查看此link以了解有关它的更多信息。 connect()应该是您执行此操作的默认方式,因为基于名称匹配的自动连接可以轻松地重命名重命名小部件,而Qt元编译器或编译器本身也不会抱怨它。

答案 1 :(得分:0)

试试这个:

#include "stdafx.h"
#include "projekt2.h"
#include "addbook.h"

projekt2::projekt2(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    connect(ui.newBook,SIGNAL(clicked(),this,SLOT(on_newBook_clicked()));
}

void projekt2::on_newBook_clicked()
{
    addBook *book;
    book = new addBook(this)
    book->setModal(true);
    book->show();
}