You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt中QPushButton弹出独立窗口 如何将其添加到默认主窗口

问题根因

按钮单独弹出新窗口是写法错误导致的:

  • 创建QPushButton实例时没有指定父窗口对象,Qt规则里没有父对象的控件会被默认当作顶级独立窗口处理
  • 主动调用了buton1->show(),对于未绑定父对象的控件,这个调用会直接让它作为独立窗口弹出
  • 代码顺序错误:先创建按钮再调用ui->setupUi(this)初始化主窗口UI,主窗口的承载结构没初始化完成,控件无法正常挂载
  • 额外注意:QMainWindow有固定结构,所有业务控件不能直接挂在QMainWindow本身上,必须挂载到它自带的centralWidget中央部件上,否则就算指定父对象也会显示异常。
修正方案
  1. 把ui->setupUi(this)移动到MainWindow构造函数的第一行,先完成主窗口基础UI初始化
  2. 创建QPushButton时,第二个参数传入ui->centralWidget作为父对象,把按钮绑定到主窗口的中央部件上
  3. 删除单独给按钮写的buton1->show()调用,父窗口显示时子控件会自动跟随渲染,不需要单独调用show
  4. (可选优化)main.cpp里同时写了w.setWindowState(Qt::WindowMaximized)和w.showFullScreen(),两个接口效果冲突:前者是窗口最大化(保留系统标题栏),后者是全屏模式(无标题栏占满整个屏幕),按需保留一个即可。

修正后的mainwindow.cpp完整代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QPushButton"
#include "QDesktopWidget"
#include <iostream>

using namespace std;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    // 优先初始化主窗口UI
    ui->setupUi(this);
    // 创建按钮时直接绑定父对象为主窗口中央部件
    QPushButton* buton1 = new QPushButton("Hello", ui->centralWidget);
    buton1->setGeometry(QRect(QPoint(100,100),QSize(200,50)));
    connect(buton1, &QPushButton::released, this, &MainWindow::buton_fonk);
    // 移除按钮单独的show调用
}

void MainWindow::buton_fonk()
{
    cout << "here" << endl;
}

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

如果要使用普通窗口最大化效果,main.cpp可调整为:

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

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.showMaximized();
    return a.exec();
}

内容的提问来源于stack exchange,提问作者fatih_koca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:18:27