Требования: После нажатия на кнопку главное окно [Open] , чтобы открыть окно ребенка, и текст на кнопке меняется на [Close] Нажмите , чтобы закрыть окно ребенка снова!
Анализ: На самом деле, к югу всплывающее окно не трудно достичь, ключ для достижения той же кнопки для открытия и закрытия функции, необходимо обратить внимание на способы достижения, а также некоторые детали нужно использовать лямбда - выражения, выполните следующие действия:
1, сначала создайте новый проект , создать пустое окно файла, как показано на рисунке 1, а затем щелкните правой кнопкой мыши на проекте, выберите Добавить новый файл, выберите тип C ++ Class и выберите QWidget основе, создать файл с именем childWin дочернего окна, как показано на рисунке 2.
2, код widget.h файла , чтобы добавить следующее, в котором создаются выбранный общественный класс в главном окне и дочернее окно объекты кнопки глобально , чтобы иметь возможность использовать эти объекты могут быть использованы в функции слота.
#include <QWidget>
#include "childwin.h"
#include <QPushButton>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
//创建按钮对象和子窗口对象
QPushButton *btn;
childWin *win;
//弹出/关闭子窗口的槽函数
void showChildWin();
private:
Ui::Widget *ui;
};
3, код widget.cpp файл ниже, добавить свои собственные в основном есть комментарий, я выберу несколько кодов ключевой говорить. Во-первых, кнопка инициализации и объект Субокно, кнопка исходный текст при условии [пуск], функцию определения в функции слот, текст кнопки приобретение [Open], затем нажмите поп подокно [Закрыть], а затем нажмите кнопку, чтобы закрыть окно; и, наконец, соединить сигналы и слоты, и для достижения нажмите [пуск] текст в Close на данный момент я использую лямбда-выражения, вы можете определить эти функции непосредственно подключения, где this-> showChildWin (); это вызов функции слота, нажмите кнопку запуска сигнала будет вызывать функцию, а затем использовать btn-> SetText ( «закрыто»); текст кнопки изменится, поэтому нажмите снова закрывает окно ребенка! Операционные результаты, как показано ниже:
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#pragma execution_character_set("utf-8"); //如果中文出现乱码加上这行!!!
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//定义主窗口大小
resize(380,300);
setWindowTitle("主窗口");
//创建一个子窗口对象
this->win = new childWin;
win->resize(350,200);
win->setWindowTitle("子窗口");
//创建一个按钮对象
this->btn = new QPushButton("打开",this);
btn->move(100,80);
//连接信号和槽,利用lambda表达式改变按钮上的文字
connect(btn,&QPushButton::clicked,this,[=](){
this->showChildWin();
btn->setText("关闭");
});
//connect(btn,&QPushButton::clicked,this,&Widget::showChildWin);
}
//定义弹出子窗口的槽函数
void Widget::showChildWin()
{
if(btn->text()=="打开")
win->show();
if(btn->text()=="关闭")
win->close();
}
Widget::~Widget()
{
delete ui;
}
4. Примечание: использование лямбда-выражения () ВПодключение, потому что вы не можете btn-> SetText ( «закрыто»); выражение в функцию слот в WIN-> шоу (), а позже, потому что система основана на последовательная программа для чтения, вы сразу установить на [Close] будет выполняться сразу WIN-> Close ();, в результате нажатия кнопки, чтобы открыть дочернее окно автоматически закроется, а не нажав на кнопку еще раз, чтобы закрыть! Этот пункт записки! Существует не в функции слота для инициализации подокна, или нажать на кнопке снова создает новое дочернее окно всплывает, вместо того, чтобы закрыть окно болтовни ребенка раньше!