QT5 在mainwindows窗口下点击按钮弹出新窗口,希望在窗口中点击按钮关闭弹窗,但是直接用槽失败了。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT5 在mainwindows窗口下点击按钮弹出新窗口,希望在窗口中点击按钮关闭弹窗,但是直接用槽失败了。相关的知识,希望对你有一定的参考价值。

如题,本着学习的态度,使用纯代码,没有使用ui界面来进行操作。
先在创建的mainwindow界面通过一个button的槽new了一个弹窗(discoverDialog),然后在弹窗中创建了一个取消按钮想要关闭弹窗(bt2).
我直接在.cpp的构造函数中创建connect(bt2,SIGNAL(clicked()),discoverDialog,SLOT(close()));
因为close和clicked都是通用的,所以这么做应该是ok的吧??

其次,我也试过创建SLOT函数,但是两种做法,结果都是无法通过点击bt2按钮关闭弹窗。

请各路大神指教指教。是不是因为通过按钮激活的弹窗,所以信号这么直接传传不出来啊?要怎么做才能搞定?
弹窗是在按钮的槽函数里new出来的。

1、首先Qt安装包较大,最后使用下载工具进行下载,下载时间视所在网络带宽而定。

2、下载完后,点击“打开”,直接运行Qt安装程序,点击“Next”继续安装。

3、在安装程序界面,输入注册的Qt用户名和密码,勾选“I accept the service terms.”后,点击“Next”进入下一步。

4、在安装文件夹处选择你想要安装的目录位置,勾选“Associate common file types with Qt Creatore.”表示关联,点击“下一步”继续。

5、最后在“正在完成Qt 向导”页面,取消“Lauch Qt Creator”,点击“完成”即完成Qt的安装。

参考技术A 这句是你的问题吧
希望在窗口中点击按钮关闭弹窗,但是直接用槽失败了

那你贴的代码明显不是关闭窗口的,麻烦吧你的关键代码贴出来。追问

是的,如你所说,直接在构造函数中使用槽,失败了

希望做到点击adddevic窗口的按钮弹出discoverDialog窗口,点击该弹窗中的bt2按钮关闭弹窗。

关于关闭窗口的代码我就只有这一句。

不好意思,我是小白,刚刚上手不到一周。有点乱。应该怎么做?

追答

我测试了下,没问题,你是要这种效果吧

代码:

#include "widget.h"
#include "ui_widget.h"
#include <QDialog>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)

    ui->setupUi(this);


Widget::~Widget()

    delete ui;


void Widget::on_pushButton_clicked()

    dlg = new QDialog(this);
    QPushButton * btn = new QPushButton("clicked", dlg);

    connect(btn, SIGNAL(clicked(bool)), this, SLOT(on_pushButton_clicked2()));

    dlg->setModal(true);
    dlg->show();


void Widget::on_pushButton_clicked2()

    dlg->close();

本回答被提问者和网友采纳
参考技术B 感觉好乱。。。多贴点代码出来追问

好的。

1.这是我的槽处理代码,直接写在构造函数中,希望做到点击adddevic窗口的按钮弹出discoverDialog窗口,点击该弹窗中的bt2按钮关闭弹窗。



2.这是我的弹窗创建代码,是在adddevice窗口中一个按钮的槽函数中创建的

Qt:脚本在按下按钮之前运行

【中文标题】Qt:脚本在按下按钮之前运行【英文标题】:Qt: script runs before button is pressed 【发布时间】:2017-01-04 11:36:23 【问题描述】:

我创建了一个有两个按钮的 gui:一个显示“打开输入文件:”,另一个显示“运行”。

当有人点击“打开输入文件:”时,他/她可以选择一个文件作为输入,然后当该人点击“运行”时,脚本 runScrapy 应该会启动。

设置按钮的部分如下所示:

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    self.pushButton.setText(_translate("MainWindow", "Open Input File:"))
    self.pushButton.clicked.connect(self.showDialog)
    self.pushButton_2.setText(_translate("MainWindow", "Run"))
    self.pushButton_2.clicked.connect(self.runScrapy)
    self.label.setText(_translate("MainWindow", "Happy Scraping"))

def showDialog(self):
    fileName = QFileDialog.getOpenFileName()
    if fileName:
        global file
        file = fileName[0]
        print(file)

def runScrapy(self):
    process = CrawlerProcess()
    process.crawl(BasicSpider)
    process.start()  # the script will block here until the crawling is finished

但是,当单击 pushButton_2 时,不是运行“runScrapy”,而是在我启动此脚本后立即开始运行“runScrapy”。我不明白为什么,因为 showDialog 仅在您单击“打开输入文件:”后才会弹出。

问:如何更改我的代码以使 runScrapy 仅在单击 pushButton_2 时运行?

提前致谢!

【问题讨论】:

【参考方案1】:

你应该从 Qt 事件处理开始。

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
# set your window/mainwindow here
sys.exit(app.exec_())

也许这个教程也有帮助:Qt GUI app with python

【讨论】:

以上是关于QT5 在mainwindows窗口下点击按钮弹出新窗口,希望在窗口中点击按钮关闭弹窗,但是直接用槽失败了。的主要内容,如果未能解决你的问题,请参考以下文章

Python3 Qt5 主窗口

在显示推送通知弹出窗口时禁用点击主页按钮

js一个按钮点击后弹出数字1再点击弹出数字2,每次弹出都加1

C# WPF: 在一个窗体上设置一个按钮,点击这个按钮时,打开新窗体并关闭原窗体?

visual studio 2010 C++,怎么通过点击主窗口上一个按钮控件,弹出一个类似于主窗口的窗口?

在弹出视图之外的任何地方点击时关闭弹出视图,包括按钮、文本字段等