【问题标题】:QT Slots and signals, showing 2nd form/windowQT 插槽和信号,显示第二个表格/窗口
【发布时间】:2016-12-05 21:08:17
【问题描述】:

我有一个 QT 应用程序,我试图让我的一个窗口中的按钮打开另一个窗口。

到目前为止,我主要完成窗口对象的方式是这样的:

Website control;
control.show();

这将很好地显示我的第一个窗口,如果我以类似的方式声明我的另一个窗口,也会在运行时显示,尽管这不是我想要的

然后在单独的头文件中:

class Website: public QWidget, public Ui::Website
{
public:
Website();
}

然后在对应的Cpp文件中我有:

Website::Website()
{
setupUi(this);
}

现在所有这些都正常工作并添加了一个自定义插槽,因此当我单击一个按钮时,它会触发我的其他 cpp 文件中的一个插槽。问题是我不确定如何显示我的另一个窗口,因为我在我的主窗口中声明它们所以无法访问它们来执行 .show()?

任何帮助将不胜感激,我对 C++ 和 QT 还很陌生

【问题讨论】:

  • 嗨,我的回答有帮助吗?

标签: c++ qt signals-slots


【解决方案1】:

我不清楚你想做什么。但我可能会理解你的挣扎,因为我自己第一次接触这个框架。

假设您有一个控制主窗口视图的 MainWindow 类。比您要创建由网站类控制的第二个窗口。

然后您希望连接这两个类,以便当您单击网站窗口上的按钮时,主窗口中会发生一些事情。

我为你做了一个简单的例子,它也在GitHub

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "website.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

public slots:
    void changeText();

private slots:
    void on_openButton_clicked();

private:
    Ui::MainWindow *ui;

    //You want to keep a pointer to a new Website window
    Website* webWindow;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

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

void MainWindow::changeText()
{
    ui->text->setText("New Text");
    delete webWindow;
}

void MainWindow::on_openButton_clicked()
{
    webWindow = new Website();
    QObject::connect(webWindow, SIGNAL(buttonPressed()), this, SLOT(changeText()));
    webWindow->show();
}

网站.h

#ifndef WEBSITE_H
#define WEBSITE_H

#include <QDialog>

namespace Ui {
class Website;
}

class Website : public QDialog
{
    Q_OBJECT

public:
    explicit Website(QWidget *parent = 0);
    ~Website();

signals:
    void buttonPressed();

private slots:
    void on_changeButton_clicked();

private:
    Ui::Website *ui;
};

#endif // WEBSITE_H

网站.cpp

#include "website.h"
#include "ui_website.h"

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

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

void Website::on_changeButton_clicked()
{
    emit buttonPressed();
}

项目组成:

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

HEADERS  += mainwindow.h \
    website.h

FORMS    += mainwindow.ui \
    website.ui

考虑要组合的 UI:

  • 主窗口:一个名为“text”的标签和一个名为“openButton”的按钮
  • 网站窗口:一个名为“changeButton”的按钮

所以关键点是信号和槽之间的连接以及窗口指针或引用的管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 2015-07-18
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多