我的QMainWindow上有两个按钮.一个到btnShowKb和另一个btnHideKb.当我按btnShowKb时,它会显示一个QWidget.我希望这个QWidget始终位于所有窗口的顶部,直到我按下btnHideKb.当它在顶部时,我想要激活QWidget和QMainWidget.
有人可以建议吗?
// 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出现.我单击"确定" - …
我在向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中 …
我想将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中而不会有任何问题.
如何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) 有一些我不明白的事情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中进行子类化,或者如何以不同方式构造我的应用程序以避免需要它?
谢谢
我正在尝试增加QMainWidget中包含的小部件和QMainWidget边缘之间的填充.您可以在下图中看到问题:

QTabWidget(它是QMainWidget的中心小部件)和主窗口的左边缘之间没有填充.此外,QDockWidgets与主窗口的右边缘之间没有填充.
我尝试使用QSS样式表增加填充:
QMainWindow {
padding: 10px;
margin: 10px;
border: 5px solid red;
}
Run Code Online (Sandbox Code Playgroud)
但得到了一些非常意外的结果:

我尝试调用setContentsMargins方法,但它实际上改变了中心小部件周围的边距,正如方法的名称所示.
如何在QMainWindow和包含的小部件之间增加填充?有没有办法用QSS改变它?
我正在尝试创建一个由a组成的应用程序QMainWindow,其中央部件是一个QToolBar(它可能不常见,但出于我的目的,工具栏非常适合).码头只允许在下面.我加了QDockWidget它,并且QAction在QToolBar切换的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特定的.
我设计了一个 Pyside Qt 应用程序,我想QtCore.Qt.WindowStaysOnTopHint在我的主窗口中切换窗口标志。使用此代码设置此提示工作正常:
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
self.show()
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用 Pyside 删除窗口标志。
有人知道怎么做这个吗?
我正在尝试获取屏幕位置QMainWindow和print位置 (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,我该如何实现?
qmainwindow ×10
qt ×5
qt4 ×4
c++ ×3
pyqt ×2
pyside ×2
python ×2
qwidget ×2
coordinates ×1
designer ×1
flags ×1
macos ×1
position ×1
qdockwidget ×1
qmenubar ×1
qmessagebox ×1
qt-creator ×1
qt5 ×1