【问题标题】:Using a Slot to Create a Dialog使用插槽创建对话框
【发布时间】:2019-08-06 20:00:32
【问题描述】:

单击按钮时,我需要在当前程序的顶部创建一个新窗口(在这种情况下我正在尝试一个对话框)。我有这个工作,但我无法编辑对话框的内容。据我所知,没有为此创建 .ui 文件,只有在我将按钮连接到函数时才会创建它。

我曾尝试使用 QMessageBox,但无法根据需要调整窗口大小。并且仍然遇到添加其他元素的问题。

void MyNameSpace::openInfoDialog()
{
    QDialog* Dialog = new QDialog(this);
    Dialog->setWindowTitle("View Stuff");
    Dialog->setMinimumSize(500,250);
    Dialog->adjustSize();
    DialogRunner* msgRunner = new DialogRunner(Dialog, this);
    msgRunner->safeExec();
}

这是我的连接

connect(_Widget.InfoBtn, SIGNAL(clicked(bool)), this, SLOT(openInfoDialog()));

此代码确实会在单击时产生一个对话框,但我需要能够向其中添加标签等内容。我还使用 QT Designer 作为我的所见即所得。

如何通过单击按钮创建新窗口并填充其他文本等?

【问题讨论】:

  • 嗯,你可以像吃你的窗口类一样自定义你的 qdialog 类,或者你可以创建另一个窗口类并像这样运行它 mySecondWindow->exec()
  • 据我所知,没有为此创建 .ui 文件,只有在我将按钮连接到函数时才会创建它。 在 C++ 代码中手动创建的对话框没有 .ui 文件。但是,您可以在项目中创建超过 1 个具有 .ui 文件的小部件。

标签: c++ qt5 qdialog


【解决方案1】:

我有这个工作,但我无法编辑内容 对话框

您可以在项目中添加 ui 文件:

使用该选项 Qt Creator 将创建一个包含 cpp 和 h 文件的类以及一个 ui 文件,您可以在其中添加其他小部件,如您习惯的那样。 使用导入指令在你需要的地方使用你的类,就像你在上面的代码中所做的那样,你将拥有你的 ui 文件。 然后将按钮的 clicked 信号与对话框类的插槽连接起来。您可以在包含按钮的类的构造函数中执行此操作。

你可以在C++ GUI Programming with Qt 4这本书中更详细地阅读这种方法 在第 2 章:创建对话框。 它可以在网上免费获得。它使用 Qt4,但在 Qt5 中它的工作方式相同。

编辑:这是一个最小的示例,它向您展示了在哪里可以使用所需的部分:一个带有按钮的主窗口(在 ui 文件中)。一个 Dialog 类,它也有一个 ui 文件(上面有几个小部件)。单击主窗口上的按钮时,将显示对话框形式。 Thjs 是我之前问你的。它使交流/测试更容易。

专业文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = test
TEMPLATE = app

SOURCES += \
    dialog1.cpp \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    dialog1.h \
    mainwindow.h

FORMS += \
    dialog1.ui \
    mainwindow.ui
**main.cpp**

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

ma​​inwindow.h

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

**mainwindow.cpp**
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog1.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Dialog1* dialog = new Dialog1(this);
    connect( ui->pushButton_1, SIGNAL(clicked()), dialog, SLOT(show()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

dialog1.h

namespace Ui {
class Dialog1;
}

class Dialog1 : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog1(QWidget *parent = nullptr);
    ~Dialog1();

private:
    Ui::Dialog1 *ui;
};
#endif // DIALOG1_H

dialog1.cpp

#include "dialog1.h"
#include "ui_dialog1.h"

Dialog1::Dialog1(QWidget *parent) : QDialog(parent),  ui(new Ui::Dialog1)
{
    ui->setupUi(this);
}

Dialog1::~Dialog1()
{
    delete ui;
}

【讨论】:

  • 我在 Designer 而非 Creator 上没有获得相同的选项,而且它也是旧版本(可能适用于 QT 4)
  • 那么我建议按照我提供的链接进行操作。它是 Qt4(你想要的)。作者使用 ui 文件和代码进行了解释(没有 ui 文件。)您查看该链接了吗?
  • 是的,我已经阅读了链接,我无法以某种方式应用它以获得所需的结果
  • 你能做一个最小的可重现的例子吗?
  • 我的代码中唯一缺少的相关部分是按钮的创建位置,但这并没有什么帮助。基本上,我需要一种方法来使该对话框在点击时出现并具有标签等内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多