QT中窗口按照使用场景分类,可以分成两大类,一类是独立显示的窗口,主要是 QWidget ,QDialog ,QMainWindow,一类是嵌套在别的窗口的子窗口,包含各种控件以及子窗口,窗口类图如下:
本篇文章只介绍 QWidget QDialog QMainWindow 这三个类。
目录
1. QWidget类
1.1 构造方法
1.2 public方法
1.3 信号
1.4 槽
2. QMainWindow类
2.1 构造方法
2.2 public方法
2.3 信号
2.4 槽
3. QDialog类
3.1 构造方法
3.2 public方法
3.3 信号
3.4 槽
4.使用举例
4.1 Qt Creator使用注意点
4.2 QWidget使用
4.3 QMainWindow使用
4.4 QDialog使用
QWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
bool acceptDrops() constQString accessibleDescription() constQString accessibleName() constQList actions() constvoid activateWindow()void addAction(QAction *action)QAction *addAction(const QString &text)QAction *addAction(const QIcon &icon, const QString &text)QAction *addAction(const QString &text, const QObject *receiver, const char *member, Qt::ConnectionType type = Qt::AutoConnection)QAction *addAction(const QIcon &icon, const QString &text, const QObject *receiver, const char *member, Qt::ConnectionType type = Qt::AutoConnection)QAction *addAction(const QString &text, Args &&... args)QAction *addAction(const QIcon &icon, const QString &text, Args &&... args)QAction *addAction(const QString &text, const QKeySequence &shortcut)QAction *addAction(const QIcon &icon, const QString &text, const QKeySequence &shortcut)QAction *addAction(const QString &text, const QKeySequence &shortcut, const QObject *receiver, const char *member, Qt::ConnectionType type = Qt::AutoConnection)QAction *addAction(const QIcon &icon, const QString &text, const QKeySequence &shortcut, const QObject *receiver, const char *member, Qt::ConnectionType type = Qt::AutoConnection)QAction *addAction(const QString &text, const QKeySequence &shortcut, Args &&... args)QAction *addAction(const QIcon &icon, const QString &text, const QKeySequence &shortcut, Args &&... args)void addActions(const QList &actions)void adjustSize()bool autoFillBackground() constQPalette::ColorRole backgroundRole() constQBackingStore *backingStore() constQSize baseSize() constQWidget *childAt(int x, int y) constQWidget *childAt(const QPoint &p) constQRect childrenRect() constQRegion childrenRegion() constvoid clearFocus()void clearMask()QMargins contentsMargins() constQRect contentsRect() constQt::ContextMenuPolicy contextMenuPolicy() constQCursor cursor() constWId effectiveWinId() constvoid ensurePolished() constQt::FocusPolicy focusPolicy() constQWidget *focusProxy() constQWidget *focusWidget() constconst QFont &font() constQFontInfo fontInfo() constQFontMetrics fontMetrics() constQPalette::ColorRole foregroundRole() constQRect frameGeometry() constQSize frameSize() constconst QRect &geometry() constQPixmap grab(const QRect &rectangle = QRect(QPoint(0, 0), QSize(-1, -1)))void grabGesture(Qt::GestureType gesture, Qt::GestureFlags flags = Qt::GestureFlags())void grabKeyboard()void grabMouse()void grabMouse(const QCursor &cursor)int grabShortcut(const QKeySequence &key, Qt::ShortcutContext context = Qt::WindowShortcut)QGraphicsEffect *graphicsEffect() constQGraphicsProxyWidget *graphicsProxyWidget() constbool hasEditFocus() constbool hasFocus() constvirtual bool hasHeightForWidth() constbool hasMouseTracking() constbool hasTabletTracking() constint height() constvirtual int heightForWidth(int w) constQt::InputMethodHints inputMethodHints() constvirtual QVariant inputMethodQuery(Qt::InputMethodQuery query) constvoid insertAction(QAction *before, QAction *action)void insertActions(QAction *before, const QList &actions)bool isActiveWindow() constbool isAncestorOf(const QWidget *child) constbool isEnabled() constbool isEnabledTo(const QWidget *ancestor) constbool isFullScreen() constbool isHidden() constbool isMaximized() constbool isMinimized() constbool isModal() constbool isVisible() constbool isVisibleTo(const QWidget *ancestor) constbool isWindow() constbool isWindowModified() constQLayout *layout() constQt::LayoutDirection layoutDirection() constQLocale locale() constQPointF mapFrom(const QWidget *parent, const QPointF &pos) constQPoint mapFrom(const QWidget *parent, const QPoint &pos) constQPointF mapFromGlobal(const QPointF &pos) constQPoint mapFromGlobal(const QPoint &pos) constQPointF mapFromParent(const QPointF &pos) constQPoint mapFromParent(const QPoint &pos) constQPointF mapTo(const QWidget *parent, const QPointF &pos) constQPoint mapTo(const QWidget *parent, const QPoint &pos) constQPointF mapToGlobal(const QPointF &pos) constQPoint mapToGlobal(const QPoint &pos) constQPointF mapToParent(const QPointF &pos) constQPoint mapToParent(const QPoint &pos) constQRegion mask() constint maximumHeight() constQSize maximumSize() constint maximumWidth() constint minimumHeight() constQSize minimumSize() constvirtual QSize minimumSizeHint() constint minimumWidth() constvoid move(const QPoint &)void move(int x, int y)QWidget *nativeParentWidget() constQWidget *nextInFocusChain() constQRect normalGeometry() constvoid overrideWindowFlags(Qt::WindowFlags flags)const QPalette &palette() constQWidget *parentWidget() constQPoint pos() constQWidget *previousInFocusChain() constQRect rect() constvoid releaseKeyboard()void releaseMouse()void releaseShortcut(int id)void removeAction(QAction *action)void render(QPaintDevice *target, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren))void render(QPainter *painter, const QPoint &targetOffset = QPoint(), const QRegion &sourceRegion = QRegion(), QWidget::RenderFlags renderFlags = RenderFlags(DrawWindowBackground | DrawChildren))void repaint(int x, int y, int w, int h)void repaint(const QRect &rect)void repaint(const QRegion &rgn)void resize(const QSize &)void resize(int w, int h)bool restoreGeometry(const QByteArray &geometry)QByteArray saveGeometry() constQScreen *screen() constvoid scroll(int dx, int dy)void scroll(int dx, int dy, const QRect &r)void setAcceptDrops(bool on)void setAccessibleDescription(const QString &description)void setAccessibleName(const QString &name)void setAttribute(Qt::WidgetAttribute attribute, bool on = true)void setAutoFillBackground(bool enabled)void setBackgroundRole(QPalette::ColorRole role)void setBaseSize(const QSize &)void setBaseSize(int basew, int baseh)void setContentsMargins(int left, int top, int right, int bottom)void setContentsMargins(const QMargins &margins)void setContextMenuPolicy(Qt::ContextMenuPolicy policy)void setCursor(const QCursor &)void setEditFocus(bool enable)void setFixedHeight(int h)void setFixedSize(const QSize &s)void setFixedSize(int w, int h)void setFixedWidth(int w)void setFocus(Qt::FocusReason reason)void setFocusPolicy(Qt::FocusPolicy policy)void setFocusProxy(QWidget *w)void setFont(const QFont &)void setForegroundRole(QPalette::ColorRole role)void setGeometry(const QRect &)void setGeometry(int x, int y, int w, int h)void setGraphicsEffect(QGraphicsEffect *effect)void setInputMethodHints(Qt::InputMethodHints hints)void setLayout(QLayout *layout)void setLayoutDirection(Qt::LayoutDirection direction)void setLocale(const QLocale &locale)void setMask(const QBitmap &bitmap)void setMask(const QRegion ®ion)void setMaximumHeight(int maxh)void setMaximumSize(const QSize &)void setMaximumSize(int maxw, int maxh)void setMaximumWidth(int maxw)void setMinimumHeight(int minh)void setMinimumSize(const QSize &)void setMinimumSize(int minw, int minh)void setMinimumWidth(int minw)void setMouseTracking(bool enable)void setPalette(const QPalette &)void setParent(QWidget *parent)void setParent(QWidget *parent, Qt::WindowFlags f)void setScreen(QScreen *screen)void setShortcutAutoRepeat(int id, bool enable = true)void setShortcutEnabled(int id, bool enable = true)void setSizeIncrement(const QSize &)void setSizeIncrement(int w, int h)void setSizePolicy(QSizePolicy)void setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)void setStatusTip(const QString &)void setStyle(QStyle *style)void setTabletTracking(bool enable)void setToolTip(const QString &)void setToolTipDuration(int msec)void setUpdatesEnabled(bool enable)void setWhatsThis(const QString &)void setWindowFilePath(const QString &filePath)void setWindowFlag(Qt::WindowType flag, bool on = true)void setWindowFlags(Qt::WindowFlags type)void setWindowIcon(const QIcon &icon)void setWindowModality(Qt::WindowModality windowModality)void setWindowOpacity(qreal level)void setWindowRole(const QString &role)void setWindowState(Qt::WindowStates windowState)void setupUi(QWidget *widget)QSize size() constvirtual QSize sizeHint() constQSize sizeIncrement() constQSizePolicy sizePolicy() constvoid stackUnder(QWidget *w)QString statusTip() constQStyle *style() constQString styleSheet() constbool testAttribute(Qt::WidgetAttribute attribute) constQString toolTip() constint toolTipDuration() constbool underMouse() constvoid ungrabGesture(Qt::GestureType gesture)void unsetCursor()void unsetLayoutDirection()void unsetLocale()void update(int x, int y, int w, int h)void update(const QRect &rect)void update(const QRegion &rgn)void updateGeometry()bool updatesEnabled() constQRegion visibleRegion() constQString whatsThis() constint width() constWId winId() constQWidget *window() constQString windowFilePath() constQt::WindowFlags windowFlags() constQWindow *windowHandle() constQIcon windowIcon() constQt::WindowModality windowModality() constqreal windowOpacity() constQString windowRole() constQt::WindowStates windowState() constQString windowTitle() constQt::WindowType windowType() constint x() constint y() const
void customContextMenuRequested(const QPoint &pos)void windowIconChanged(const QIcon &icon)void windowTitleChanged(const QString &title)
bool close()void hide()void lower()void raise()void repaint()void setDisabled(bool disable)void setEnabled(bool)void setFocus()void setHidden(bool hidden)void setStyleSheet(const QString &styleSheet)virtual void setVisible(bool visible)void setWindowModified(bool)void setWindowTitle(const QString &)void show()void showFullScreen()void showMaximized()void showMinimized()void showNormal()void update()
QMainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget)void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation)void addToolBar(Qt::ToolBarArea area, QToolBar *toolbar)void addToolBar(QToolBar *toolbar)QToolBar *addToolBar(const QString &title)void addToolBarBreak(Qt::ToolBarArea area = Qt::TopToolBarArea)QWidget *centralWidget() constQt::DockWidgetArea corner(Qt::Corner corner) constvirtual QMenu *createPopupMenu()QMainWindow::DockOptions dockOptions() constQt::DockWidgetArea dockWidgetArea(QDockWidget *dockwidget) constbool documentMode() constQSize iconSize() constvoid insertToolBar(QToolBar *before, QToolBar *toolbar)void insertToolBarBreak(QToolBar *before)bool isAnimated() constbool isDockNestingEnabled() constQMenuBar *menuBar() constQWidget *menuWidget() constvoid removeDockWidget(QDockWidget *dockwidget)void removeToolBar(QToolBar *toolbar)void removeToolBarBreak(QToolBar *before)void resizeDocks(const QList &docks, const QList &sizes, Qt::Orientation orientation)bool restoreDockWidget(QDockWidget *dockwidget)bool restoreState(const QByteArray &state, int version = 0)QByteArray saveState(int version = 0) constvoid setCentralWidget(QWidget *widget)void setCorner(Qt::Corner corner, Qt::DockWidgetArea area)void setDockOptions(QMainWindow::DockOptions options)void setDocumentMode(bool enabled)void setIconSize(const QSize &iconSize)void setMenuBar(QMenuBar *menuBar)void setMenuWidget(QWidget *menuBar)void setStatusBar(QStatusBar *statusbar)void setTabPosition(Qt::DockWidgetAreas areas, QTabWidget::TabPosition tabPosition)void setTabShape(QTabWidget::TabShape tabShape)void setToolButtonStyle(Qt::ToolButtonStyle toolButtonStyle)void splitDockWidget(QDockWidget *first, QDockWidget *second, Qt::Orientation orientation)QStatusBar *statusBar() constQTabWidget::TabPosition tabPosition(Qt::DockWidgetArea area) constQTabWidget::TabShape tabShape() constQList tabifiedDockWidgets(QDockWidget *dockwidget) constvoid tabifyDockWidget(QDockWidget *first, QDockWidget *second)QWidget *takeCentralWidget()Qt::ToolBarArea toolBarArea(const QToolBar *toolbar) constbool toolBarBreak(QToolBar *toolbar) constQt::ToolButtonStyle toolButtonStyle() constbool unifiedTitleAndToolBarOnMac() const
void iconSizeChanged(const QSize &iconSize)void tabifiedDockWidgetActivated(QDockWidget *dockWidget)void toolButtonStyleChanged(Qt::ToolButtonStyle toolButtonStyle)
void setAnimated(bool enabled)void setDockNestingEnabled(bool enabled)void setUnifiedTitleAndToolBarOnMac(bool set)
QDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
bool isSizeGripEnabled() constint result() constvoid setModal(bool modal)void setResult(int i)void setSizeGripEnabled(bool)
void accepted()void finished(int result)void rejected()
virtual void accept()virtual void done(int r)virtual int exec()virtual void open()virtual void reject()
(1)QT designer界面介绍
(2)布局管理
水平布局
垂直布局
网格布局
表格布局:和网格布局类似,一般使用网格布局就够了
打破布局:
实际业务开发中,主窗口是要设置布局的,不然某些控件可能不能显示,或者改变窗口控件大小不能自适应,这一点在开发中要注意
(3)修改程序左上角图标
(4)UI设计方式
UI设计可以使用designer设计,也可以通过编写代码设计,有些UI设计designer实现不了,所有的UI都可以通过代码来实现,在实际开发中,一般以两种结合实现UI效果。
(5)UI designer转到槽
鼠标选中控件,右键菜单“转到槽”,选择槽函数,就会进入代码编写页面
(5)显示console并在其中输出qDebug信息
步骤一:.pro文件中增加: CONFIG += console
步骤二:如下选项打勾
如下程序演示点击按钮获取输入框信息,并弹出消息框显示输出内容,运行效果如下:
代码:
工程文件:
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17 console# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.uiRC_ICONS = MainIcon.ico# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
窗口头文件,窗口实现文件,主调文件内容如下:
#ifndef WIDGET_H
#define WIDGET_H#include QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButtonGet_clicked();private:Ui::Widget *ui;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include
#include Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButtonGet_clicked()
{QString strInput = ui->lineEditInput->text();qDebug() << strInput;QMessageBox::information(this, "提示", strInput);
}
#include "widget.h"#include int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
如下程序演示继承QMainWindow类,不用Qt designer通过手写代码的方式添加布局和控件,效果展示如下:
代码如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include
#include
#include
#include
#include class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:void initUI();void initSignalSlot();private slots:void on_under_line(bool sel);void on_italic(bool sel);void on_bold(bool sel);void set_text_font_color();private:QCheckBox * m_checkBoxUnderLine;QCheckBox * m_checkBoxItalic;QCheckBox * m_checkBoxBold;QRadioButton * m_rBtnBlack;QRadioButton * m_rBtnBlue;QRadioButton * m_rBtnRed;QPlainTextEdit * m_palinTextEdit;QPushButton * m_pushBtnOK;QPushButton * m_pushBtnCancel;QPushButton * m_pushBtnClose;};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include
#include
#include MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{initUI();initSignalSlot();
}void MainWindow::initUI()
{/*if (this->objectName().isEmpty()){this->setObjectName("MainWindow");this->resize(555, 412);}*/m_checkBoxUnderLine = new QCheckBox(tr("UnderLine"));m_checkBoxItalic = new QCheckBox(tr("Italic"));m_checkBoxBold = new QCheckBox(tr("Bold"));QHBoxLayout *hLayout1 = new QHBoxLayout;hLayout1->addWidget(m_checkBoxUnderLine);hLayout1->addWidget(m_checkBoxItalic);hLayout1->addWidget(m_checkBoxBold);m_rBtnBlack = new QRadioButton(tr("Black"));m_rBtnBlue = new QRadioButton(tr("Blue"));m_rBtnRed = new QRadioButton(tr("Red"));QHBoxLayout *hLayout2 = new QHBoxLayout;hLayout2->addWidget(m_rBtnBlack);hLayout2->addWidget(m_rBtnBlue);hLayout2->addWidget(m_rBtnRed);m_palinTextEdit = new QPlainTextEdit(tr(""));QFont font = m_palinTextEdit->font();font.setPointSize(20);m_palinTextEdit->setFont(font);m_palinTextEdit->setPlainText("QT\n\n你好啊\n\n很高兴认识你!");m_pushBtnOK = new QPushButton(tr("Ok"));m_pushBtnCancel = new QPushButton(tr("Cancel"));m_pushBtnClose = new QPushButton(tr("Close"));QHBoxLayout *hLayout3 = new QHBoxLayout;hLayout3->addStretch();hLayout3->addWidget(m_pushBtnOK);hLayout3->addWidget(m_pushBtnCancel);hLayout3->addStretch();hLayout3->addWidget(m_pushBtnClose);QVBoxLayout *vLayout = new QVBoxLayout;vLayout->addLayout(hLayout1);vLayout->addLayout(hLayout2);vLayout->addWidget(m_palinTextEdit);vLayout->addLayout(hLayout3);//说明直接调用setLayout窗口显示不出控件,原因是MainWindow已经//有默认的layout了,此处我们新建一个QWidget,然后让MainWindow//将新建的QWidget来安装,然后在新建的QWidget中进行相关布局//setLayout(vLayout);QWidget *widget = new QWidget(this);widget->setLayout(vLayout);setCentralWidget(widget);
}void MainWindow::initSignalSlot()
{connect(m_checkBoxUnderLine, SIGNAL(clicked(bool)), this, SLOT(on_under_line(bool)));connect(m_checkBoxItalic, SIGNAL(clicked(bool)), this, SLOT(on_italic(bool)));connect(m_checkBoxBold, SIGNAL(clicked(bool)), this, SLOT(on_bold(bool)));connect(m_rBtnBlack, SIGNAL(clicked()), this, SLOT(set_text_font_color()));connect(m_rBtnBlue, SIGNAL(clicked()), this, SLOT(set_text_font_color()));connect(m_rBtnRed, SIGNAL(clicked()), this, SLOT(set_text_font_color()));connect(m_pushBtnOK, SIGNAL(clicked()), this, SLOT(accept()));connect(m_pushBtnCancel, SIGNAL(clicked()), this, SLOT(reject()));connect(m_pushBtnClose, SIGNAL(clicked()), this, SLOT(close()));
}void MainWindow::on_under_line(bool sel)
{QFont font = m_palinTextEdit->font();font.setUnderline(sel);m_palinTextEdit->setFont(font);
}void MainWindow::on_italic(bool sel)
{QFont font = m_palinTextEdit->font();font.setItalic(sel);m_palinTextEdit->setFont(font);
}void MainWindow::on_bold(bool sel)
{QFont font = m_palinTextEdit->font();font.setBold(sel);m_palinTextEdit->setFont(font);
}void MainWindow::set_text_font_color()
{QPalette plet = m_palinTextEdit->palette();if (m_rBtnBlack->isChecked()) {plet.setColor(QPalette::Text, Qt::black);}else if (m_rBtnBlue->isChecked()) {plet.setColor(QPalette::Text, Qt::blue);}else {plet.setColor(QPalette::Text, Qt::red);}m_palinTextEdit->setPalette(plet);
}MainWindow::~MainWindow()
{
}
#include "mainwindow.h"#include int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
如下程序演示使用QDialog制作一个大小固定的登录窗口,效果显示如下:
界面布局如下:
代码如下:
#ifndef LOGIN_H
#define LOGIN_H#include namespace Ui {
class Login;
}class Login : public QDialog
{Q_OBJECTpublic:explicit Login(QWidget *parent = nullptr);~Login();private:Ui::Login *ui;
};#endif // LOGIN_H
#include "login.h"
#include "ui_login.h"Login::Login(QWidget *parent) :QDialog(parent),ui(new Ui::Login)
{ui->setupUi(this);setFixedSize(399, 318);
}Login::~Login()
{delete ui;
}
#include "login.h"
#include "ui_login.h"Login::Login(QWidget *parent) :QDialog(parent),ui(new Ui::Login)
{ui->setupUi(this);setFixedSize(399, 318);
}Login::~Login()
{delete ui;
}
上一篇:警惕!新套路盯上新消费