qt中如何实现点击一个窗口的按钮,另一个窗口开始画图? 十万火急

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt中如何实现点击一个窗口的按钮,另一个窗口开始画图? 十万火急相关的知识,希望对你有一定的参考价值。

就是怎样实现点击一个窗口的按钮,调用另一个窗口的事件

现在主要的问题是你怎么能够获得按钮和另一个窗口的探针
如果你的代码架构不能这么实现的话试一下全局变量,在创建的按钮的时候把按钮的地址保存起来,把绘图的窗口也保存起来,,,
connect(button,SIGNAL(clicked()),this,SLOT(slotf()));
用它连接的时候应该保证按钮的指针和窗口的指针都是合法、有效的
你的绘图代码放到窗口的槽函数里,或者让槽函数调用绘图代码
参考技术A connect(button,SIGNAL(clicked()),this,SLOT(slotf()));
按钮按下的时候 发射信号
然后另一个窗口事件接受信号
connect就好
参考技术B 信号与槽呗 你问的太模糊了

如何在java程序中,当点击一个按钮后,关闭当前窗口,开启一个新的窗口。

    首先分析需要的GUI技术

java中一般使用swing 和awt技术来实现图形界面,Swing组件较多,功能比较强大,所以这里使用Swing组件来实现。窗口使用(JFrame),按钮使用(JButton)。


    设想一个符合题目需求的场景

两个窗口关联并且跳转,最常见的场景就是登陆了。

登陆窗口,输入用户名和密码,如果成功就跳转到主窗口


    核心逻辑,跳转窗口的关键代码

    一般可以隐藏本窗口(setVisible(false);),显示新窗口来实现窗口的跳转。

但是隐藏窗口,会在后面浪费系统资源。

如果不再使用该窗口,应该彻底销毁(dispose();),释放系统资源


    代码和注释

LoginFrame 类

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

//LoginFrame 登陆窗口  功能 实现用户登陆 ,如果成功就跳转
//LoginFrame 继承于窗口类, 并实现ActionListener接口
public class LoginFrame extends JFrame implements ActionListener 
// 申明需要的组件
JButton jb1, jb2;//按钮
JTextField jtf1;//文本框
JPasswordField jpf1;//密码框

public LoginFrame() 
// 窗口属性的设置
setTitle("登陆窗");// 窗口标题
setSize(300, 180);// 窗口大小
setLocationRelativeTo(null);// 窗口居中
setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭窗口则退出虚拟机
setLayout(new FlowLayout());// 设置布局流式布局

JPanel jp = new JPanel(new GridLayout(4, 1));// 设置面板为表格布局4行1列
// 第一行
JPanel jp1 = new JPanel();
JLabel jl1 = new JLabel("账号 ");
jtf1 = new JTextField(12);
jp1.add(jl1);
jp1.add(jtf1);
jp.add(jp1);
// 第二行
JPanel jp2 = new JPanel();
JLabel jl2 = new JLabel("密码 ");
jpf1 = new JPasswordField(12);
jp2.add(jl2);
jp2.add(jpf1);
jp.add(jp2);
// 第三行
JPanel jp3 = new JPanel();
jb1 = new JButton("登陆");
jb1.addActionListener(this);// 添加动作响应器
jb2 = new JButton("重置");
jb2.addActionListener(this);// 添加动作响应器
jp3.add(jb1);
jp3.add(jb2);
jp.add(jp3);
// 第四行
JPanel jp4 = new JPanel();
JLabel jl3 = new JLabel("提示: 账号 admin 密码 123");
jl3.setForeground(Color.DARK_GRAY);
jp4.add(jl3);
jp.add(jp4);

add(jp);



// 动作响应
public void actionPerformed(ActionEvent e) 
String cmd = e.getActionCommand();// 根据动作命令,来进行分别处理
if (cmd.equals("登陆")) 
String id = jtf1.getText();// 取得用户名
String key = new String(jpf1.getPassword());// 取得密码
if (id.equals("admin") && key.equals("123")) // 判断是否登录成功
// 如果登录成功
setVisible(false);// 本窗口隐藏,
new MainFrame(id).setVisible(true);// 新窗口显示
dispose();//本窗口销毁,释放内存资源
 else 
//如果登录失败  弹出提示
JOptionPane.showMessageDialog(this, "用户名或者密码错误.", "通知", JOptionPane.ERROR_MESSAGE);
clearText();//清空文本框 密码框的输入

 else if (cmd.equals("重置")) 
clearText();




private void clearText() //清空文本框, 密码框的输入
jtf1.setText("");
jpf1.setText("");


//main方法, 程序的入口
public static void main(String[] args) 
new LoginFrame().setVisible(true);//创建登录窗口,并可见


MainFrame类

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MainFrame extends JFrame 

public MainFrame(String name) 
setTitle("主窗口");//标题
setSize(300, 260);//大小
setLocationRelativeTo(null);//居中
setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel jp = new JPanel();
JLabel jl1 = new JLabel("欢迎");
JLabel jl2 = new JLabel(name);
jl2.setForeground(Color.BLUE);//设置文本颜色
JLabel jl3 = new JLabel("使用系统.");
jp.add(jl1);
jp.add(jl2);
jp.add(jl3);
add(jp, BorderLayout.NORTH);
JTextArea jta = new JTextArea();
jta.setLineWrap(true);
jta.append("消息提示");
jta.append(" 消息!通知~!");
JScrollPane jsp = new JScrollPane(jta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(jsp);
JPanel jp2 = new JPanel();
JButton jb = new JButton("退出");
jb.addActionListener(new ActionListener() 
public void actionPerformed(ActionEvent e) 
System.exit(0);//退出

);
jp2.add(jb);
add(jp2,BorderLayout.SOUTH);



    运行效果图

参考技术A JButton btn=new JButton(new AbstractAction("关闭并打开")       @Override   public void actionPerformed(ActionEvent e)       oldFrame.dispose();// 关闭并销毁,无需销毁可采用oldFrame.setVisible(false);      newFrame.setVisible(true);// 打开新窗口   );

import javax.swing.*;


import java.awt.Rectangle;

import java.awt.event.*;


public class Swing7 extends JFrame implements ActionListener

JButton jb = new JButton();

public Swing7()

this.setTitle("Java——");

jb.setText("确定");

jb.setMnemonic('a');

this.add(jb);

this.setBounds(200, 300, 250, 300);

ctionListener就是Swing7实例。


public void actionPerformed(ActionEvent e) // 实现ActionListener接口的actionPerformed接口。

JFrame frame = new JFrame("新窗口");//构造一个新的JFrame,作为新窗口。

frame.setBounds(// 让新窗口与Swing7窗口示例错开50像素。

new Rectangle(

(int) this.getBounds().getX() + 50,

(int) this.getBounds().getY() + 50,

(int) this.getBounds().getWidth(),

(int) this.getBounds().getHeight()
)
);

JLabel jl = new JLabel();// 注意类名别写错了。

frame.getContentPane().add(jl);

jl.setText("这是新窗口");

jl.setVerticalAlignment(JLabel.CENTER);
jl.setHorizontalAlignment(JLabel.CENTER);// 注意方法名别写错了。
frame.setVisible(true);


public static void main(String args[])
Swing7 s = new Swing7();


参考技术B 当前窗口.dispose(),然后new 新窗口即可 参考技术C package com.iflytek.gui;
import java.awt.Button;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
public class chuangkou

private static final LayoutManager GridLayout = null;
public static void main(String[] args)
final JFrame fr =new JFrame("窗口1");
fr.setLayout(GridLayout);
fr.setBounds(100, 180, 400, 400);
Button b = new Button("登录");
b.setBounds(80, 80, 80, 80);
fr.add(b);
fr.setVisible(true);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

b.addActionListener(new ActionListener()

@Override
public void actionPerformed(ActionEvent e)
JFrame jf = new JFrame("窗口2");
jf.setSize(400, 400);
jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
fr.dispose();
jf.setVisible(true);

);

追问

disp0se报错

我是在是在主函数中new了类,在监听中如何实现调用关闭它呢

参考技术D 根据提示操作追问

??

不懂大神

以上是关于qt中如何实现点击一个窗口的按钮,另一个窗口开始画图? 十万火急的主要内容,如果未能解决你的问题,请参考以下文章

JQuery如何实现在弹窗中点击按钮,继续弹出一个新弹窗,而不是打开新页面

QT中父窗口响应子窗口动作

QT C++ 编写多窗口之间的跳转 在一个窗口中可以变化很多UI界面

qt界面怎么去掉窗口关闭的按钮

c#中,如何实现一个按钮控制另一个窗口的打开和关闭,即点击一下,新窗口打开,再点击一下,打开的新窗

qt中如何创建2个窗口,点击窗口a上按钮打开窗口b,在b关闭前无法对a操作