标签: qmainwindow

如何让QWidget始终处于领先地位?

我的QMainWindow上有两个按钮.一个到btnShowKb和另一个btnHideKb.当我按btnShowKb时,它会显示一个QWidget.我希望这个QWidget始终位于所有窗口的顶部,直到我按下btnHideKb.当它在顶部时,我想要激活QWidget和QMainWidget.

有人可以建议吗?

qwidget qmainwindow

8
推荐指数
2
解决办法
1万
查看次数

隐藏QMainWindow的问题:显示QMessageBox后应用程序崩溃

// main.cpp

#include <QApplication>

#include "mainwindow.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MainWindow* window = new MainWindow();
    window->show();
    return app.exec();
}

// mainwindow.cpp

#include <QTimer>
#include <QMessageBox>
#include <iostream>

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    this->setCentralWidget(new QWidget());
}

void MainWindow::mousePressEvent(QMouseEvent* event)
{
    this->hide();
    QTimer* timer = new QTimer();
    timer->setInterval(3*1000);
    timer->start();
    connect(timer, SIGNAL(timeout()), this, SLOT(showMessageBox()));
}

void MainWindow::showMessageBox()
{
    QMessageBox::information(this, "Hello,", "world!", QMessageBox::Ok);
}

MainWindow::~MainWindow()
{
    std::cerr << "Destructor called" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我点击窗口 - 它隐藏,QMessageBox出现.我单击"确定" - …

c++ qt qt4 qmessagebox qmainwindow

8
推荐指数
1
解决办法
5298
查看次数

MenuBar不显示简单的QMainWindow代码,Qt Creator Mac OS

我在向Qt桌面应用程序中的内置菜单栏添加菜单项时遇到问题.我复制了QMainWindow类参考文档中提供的代码,用于创建一个非常简单的应用程序的菜单.不幸的是,它在代码运行时没有显示出来.我只是想在菜单栏中添加"文件"菜单.我正在运行Mac OSX 10.9.3和Qt Creator 5.3.1.

我的代码截图如下.我在mainwindow.cpp源代码中尝试了未注释和注释的代码.

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //myMenuBar = menuBar();
    //fileMenu = myMenuBar -> addMenu(tr("&File"));

    fileMenu = menuBar() -> addMenu(tr("&File"));

    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}
Run Code Online (Sandbox Code Playgroud)

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QMenuBar* myMenuBar;
    QMenu* fileMenu;
};

#endif //MAINWINDOW_H
Run Code Online (Sandbox Code Playgroud)

main.cpp中 …

c++ macos qt qmainwindow qmenubar

8
推荐指数
3
解决办法
8426
查看次数

Qt4:将QMainWindow实例放在其他QWidget/QMainWindow中

我想将QMainWindow实例放在另一个QWidget中(例如另一个QMainWindow的centralWidget).

我想知道它为什么不起作用?QMainWindow直接从QWidget继承.将QWidget放在另一个QWidget中可以正常工作.

我经常将QMainWindow实例放在QTabBar中而没有任何问题.

ps你可能会问为什么我需要使用QMainWindow?我想使用垂直布局在1个表单中放置2个小部件.我希望这两个小部件直接在它们上面分别使用工具栏.

也许还有其他方法可以使用QtCreator将工具栏放在普通的QWidgets中?


编辑

第一个例子(工作正常)

我基于QWidget创建新的类/表单.(QtCreator根据标准模板创建3个文件*.cpp,*.h和*.ui).

类声明看起来像这样

class NotesEditor : public QWidget
{
    Q_OBJECT

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

private:
    Ui::NotesEditor *ui;
};
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这个小部件并将其放在另一个小部件中时,它工作正常.我使用qtcreator的"提升到..."功能 - 这里没有问题.

第二个例子(不起作用)

我基于QMainWindow创建了新的类/表单.(QtCreator根据标准模板创建3个文件*.cpp,*.h和*.ui).

类声明如下所示:

class Notes : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::Notes *ui;
};
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试将此小部件放在另一个小部件中时,它不可见.和之前一样,我使用了qtcreator的"promote to ..."功能.

两个小部件(首先基于QWidget,第二个基于QMainWindow)具有基于标准qtcreator代码模板的相同默认结构.我在这里没有太大变化 - 只是在表单设计器中添加了一些按钮.

在第二个例子中,我尝试在类实例上使用setEnabled(true)和setVisible(true).第一个没有结果.第二个在单独的窗口中打开此小部件.


我认为最大的问题是QMainWindow是否会嵌套在另一个QWidget中.正如我在QMainWindow之前写的那样,实例可以放在QTabWidgets中而不会有任何问题.

qt qt4 qwidget qt-creator qmainwindow

7
推荐指数
2
解决办法
6857
查看次数

在QMainWindow中添加孩子

如何Widget在相等的部分添加两个子对象QMainWindow.

MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent)

{   TreeArea *ta= new TreeArea(this);
    TreeArea *ta1= new TreeArea(this);
.
.
.
  TreeArea::TreeArea(QWidget *parent) :
 QWidget(parent)
{
.
.
.
Run Code Online (Sandbox Code Playgroud)

qt4 qmainwindow

7
推荐指数
2
解决办法
1万
查看次数

Qt Designer无法推广QMainWindow

有一些我不明白的事情Qt Designer.我一直在使用它已经有一段时间了,但我仍然总是手动编辑.ui文件.

正如在Qt的每个教程中可以看到的那样,在创建GUI时,你要做的第一件事就是子类化QMainWindow- 例如,为了捕获和重新定义closeEvent()函数.

但是,不可能QMainWindow在Qt Designer中进行子类化("提升")- 您可以使用许多其他类来完成它,但不能使用此类.

我通常做的是编辑.ui文件并更改:

<class>MainWindow</class>
  <widget class="QMainWindow" name="MainWindow">
Run Code Online (Sandbox Code Playgroud)

通过:

< widget class="MyMainWindow" name="MainWindow">
Run Code Online (Sandbox Code Playgroud)

这样我的代码可以QMainWindow在我的代码中正确子类化:

class MyMainWindow(QMainWindow, object):
    ''' I can redefine closeEvent here! '''
Run Code Online (Sandbox Code Playgroud)

显然,这很奇怪 - 我可能会错过一些关于使用Designer做到这一点的正确方法.但我找不到任何解释.

为什么不能QMainWindow在Designer中进行子类化,或者如何以不同方式构造我的应用程序以避免需要它?

谢谢

qt designer pyside qmainwindow

7
推荐指数
1
解决办法
1209
查看次数

QMainWindow和包含的小部件之间的填充

我正在尝试增加QMainWidget中包含的小部件和QMainWidget边缘之间的填充.您可以在下图中看到问题:

边缘之间的填充

QTabWidget(它是QMainWidget的中心小部件)和主窗口的左边缘之间没有填充.此外,QDockWidgets与主窗口的右边缘之间没有填充.

我尝试使用QSS样式表增加填充:

QMainWindow {
    padding: 10px;
    margin: 10px;
    border: 5px solid red;
}
Run Code Online (Sandbox Code Playgroud)

但得到了一些非常意外的结果:

出乎意料的结果

我尝试调用setContentsMargins方法,但它实际上改变了中心小部件周围的边距,正如方法的名称所示.

如何在QMainWindow和包含的小部件之间增加填充?有没有办法用QSS改变它?

c++ qt qmainwindow qt5 qtstylesheets

7
推荐指数
1
解决办法
944
查看次数

删除所有DockWidgets后如何调整QMainWindow的大小?

我正在尝试创建一个由a组成的应用程序QMainWindow,其中央部件是一个QToolBar(它可能不常见,但出于我的目的,工具栏非常适合).码头只允许在下面.我加了QDockWidget它,并且QActionQToolBar切换的QDockWidget打开和关闭与removeDockWidget()restoreDockWidget().

默认大小QMainWindow为800 x 24,QToolBars maximumHeight也设置为24.在之后removeDockWidget()被调用时,QMainWindow的几何图形设置回(0,0,800,24)setGeometry().

我想要实现的是在移除QMainWindow时将高度调整为24 DockWidget.在setGeometry()似乎因为宽度和位置的变化相应的工作,但有趣的是,高度不让步.那真的是我的问题:)

你觉得怎么回事?

这是一个屏幕演示,说明了手头的问题.

注意:如果我使用QWidget而不是QMainWindow创建相同的场景,并在子窗口小部件上使用show()hide(),那么我可以adjustSize()毫无问题地调整父级的大小:上面的问题似乎是QMainWindow特定的.

python qt4 pyqt qdockwidget qmainwindow

6
推荐指数
1
解决办法
2454
查看次数

Pyside 删除窗口标志

我设计了一个 Pyside Qt 应用程序,我想QtCore.Qt.WindowStaysOnTopHint在我的主窗口中切换窗口标志。使用此代码设置此提示工作正常:

self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
self.show()
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用 Pyside 删除窗口标志。

有人知道怎么做这个吗?

flags pyside qmainwindow

6
推荐指数
1
解决办法
3535
查看次数

如何获取`QMainWindow`的屏幕位置并打印出来?

我正在尝试获取屏幕位置QMainWindowprint位置 (x,y) 值。我已经尝试了这两个self.pos()self.mapToGlobal(self.pos())这两个 return 0

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow


class MainWindow(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        self.resize(400, 200)

        # PRINTS 0 0
        print(self.pos().x(), self.pos().y())

        # PRINTS 0 0
        print(self.mapToGlobal(self.pos()).x(), self.mapToGlobal(self.pos()).y())


app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

我正在使用 Python 3.7 和 PyQt 5.11,我该如何实现?

python position pyqt coordinates qmainwindow

6
推荐指数
2
解决办法
6696
查看次数