【问题标题】:Qt open dialog from main windowQt 从主窗口打开对话框
【发布时间】:2018-05-14 11:29:05
【问题描述】:

所以我是 Qt 的新手,我正在尝试创建一个简单的项目。我有一个带有一些按钮和使用 Qt 设计器创建的东西的 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()
{
}

当我运行它时,没有错误。我的主窗口打开,但是当我单击按钮时,什么也没有发生。我确定我错过了一些东西,比如连接,但我无法弄清楚。

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

【问题讨论】:

  • 您能否编辑问题并发布您的ui_projekt2.h 文件?
  • 从 projekt2.h 中的插槽声明中删除 'projekt2::' ,看看它是否解决了问题。
  • 你必须使用QtCreator
  • @GabriellaGiordano 哦,我的上帝,我刚刚做到了,而且成功了。非常感谢!

标签: c++ qt


【解决方案1】:

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

但要使其工作,您必须为 Qt 元编译器提供格式良好的头文件,因此请从 on_newButton_clicked() 插槽的声明中删除 'projekt2::' 前缀。

您还可以使用 Qt connect() 显式连接信号/插槽;检查此link 以了解更多信息。 connect() 应该是您执行此操作的默认方式,因为基于名称匹配的自动连接很容易在重命名小部件时被破坏,并且 Qt 元编译器或编译器本身不会抱怨它。

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      试试这个,这对我有用

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多