主頁 > 作業系統 > 為什么我的QTextEdit繼承的富文本編輯器在我嘗試呼叫textCursor()時總是崩潰?

為什么我的QTextEdit繼承的富文本編輯器在我嘗試呼叫textCursor()時總是崩潰?

2022-11-11 11:57:01 作業系統

我正在嘗試構建一個富文本編輯器,它可以使用 Qt 版本 6 呼叫所有常見的富文本格式,例如粗體、斜體和下劃線。在構建了可以正常作業且沒有錯誤的富文本格式化功能之后,我想還構建了一個高級格式檢查器。為了將代碼從 Python 轉換為 C (參見這個問題的答案),我構建了一個函式,該函式位于從QTextEdit.

當我嘗試在沒有除錯的情況下在 Qt Creator IDE 中運行我的代碼時,我發現我撰寫的代碼無法運行并且總是無緣無故地崩潰。

啟用 Qt Creator 的內置除錯器,我看到它說QTextCursor <no such value>and textCursor <no such value>. 但我<QTextCursor>正確地包括在內,并檢查了*.pro檔案(我正在運行qmake)。

為什么我的 QTextEdit 繼承的富文本編輯器在我嘗試呼叫 textCursor() 時總是崩潰?

它停在 Low Level Debugger 的第二層。

為什么我的 QTextEdit 繼承的富文本編輯器在我嘗試呼叫 textCursor() 時總是崩潰?

更新:

如果我僅通過回傳來“修復”檢查格式化功能true,則檢查的 QAction 集也會無緣無故地崩潰。看起來很奇怪。

這么煩人的問題任何幫助將不勝感激。

環境:

  • 作業系統:macOS Big Sur 11.7.1;

  • 型號:運行 64 位 Intel 處理器的 MacBook Air(11 英寸,2013 年中)x86_64

  • Qt 版本:6.3.2(Clang 13.0);

  • Qt Creator 版本:8.0.2;

最小繁殖示例:

主要的。cp :

#include "mainwindow.h"

#include <QApplication>

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

主視窗。小時

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QTextDocument>
#include <QCheckBox>
#include <QTextFrame>
#include <QTextFrameFormat>
#include <QMenuBar>
#include <QMenu>
#include <QMainWindow>
#include <QAction>

#include "Pagination/PagesTextEdit.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void checkFormatting();

private:
    QMenuBar* m_menuBar;

    QMenu* m_menuFormat;
    QAction* m_actionFormatTextBold;
    QAction* m_actionFormatTextItalic;
    QAction* m_actionFormatTextUnderline;

    QTextDocument* doc;
    PagesTextEdit* m_paginationWidget;
};
#endif // MAINWINDOW_H

主視窗。cp :

#include "mainwindow.h"

#include <QString>
#include <QScrollBar>
#include <QApplication>
#include <QTextCursor> // <- important

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QMenuBar* m_menuBar;
    m_menuBar = new QMenuBar();
    this->setMenuBar(m_menuBar);

    QMenu* m_menuFormat;
    m_menuFormat = new MenuFormat();
    m_menuFormat->setText(QString::fromStdString("F&ormat"));
    m_menuBar->addMenu(m_menuFormat);

    ActionFormatTextBold* m_actionFormatTextBold;
    m_actionFormatTextBold = new ActionFormatTextBold(this);
    m_menuFormatText->addAction(m_actionFormatTextBold);

    ActionFormatTextItalic* m_actionFormatTextItalic;
    m_actionFormatTextItalic = new ActionFormatTextItalic(this);
    m_menuFormatText->addAction(m_actionFormatTextItalic);

    ActionFormatTextUnderline* m_actionFormatTextUnderline;
    m_actionFormatTextUnderline = new ActionFormatTextUnderline(this);
    m_menuFormatText->addAction(m_actionFormatTextUnderline);

    PagesTextEdit* m_paginationWidget;
    m_paginationWidget = new PagesTextEdit;
    QTextDocument* doc;
    doc = new QTextDocument;
    doc->setDefaultFont(QFont("Times New Roman", defaultFontSize));
    m_paginationWidget->setDocument(doc);

    m_paginationWidget->setPageFormat(QPageSize::PageSizeId::A4);
    m_paginationWidget->setPageMargins(QMarginsF(20, 20, 20, 20));
    m_paginationWidget->setUsePageMode(true);
    m_paginationWidget->setPageNumbersAlignment(Qt::AlignHCenter | Qt::AlignTop);
    m_paginationWidget->setShowPageNumbers(false);
    m_paginationWidget->setTabChangesFocus(false);
    m_paginationWidget->setAcceptDrops(true);
    m_paginationWidget->setAcceptRichText(true);

    setCentralWidget(m_paginationWidget);

    connect(m_paginationWidget, &PagesTextEdit::cursorPositionChanged,
            this, &MainWindow::checkFormatting);

    connect(m_actionFormatTextBold, &QAction::triggered,
            m_paginationWidget, &PagesTextEdit::textFormatBold);
    connect(m_actionFormatTextItalic, &QAction::triggered,
            m_paginationWidget, &PagesTextEdit::textFormatItalic);
    connect(m_actionFormatTextUnderline, &QAction::triggered,
            m_paginationWidget, &PagesTextEdit::textFormatUnderline);
    
    showMaximized();
}

MainWindow::~MainWindow()
{
}

void MainWindow::checkFormatting() {
    bool bold = m_paginationWidget->isBold();
    m_actionFormatTextBold->setChecked(bold); // <- m_actionFormatTextBold also crash without checking formatting
}

PagesTextEdit。小時

#ifndef PAGESTEXTEDIT_H
#define PAGESTEXTEDIT_H

#include <QTextEdit>

#include "PageMetrics.h"

class PagesTextEdit : public QTextEdit
{
    Q_OBJECT

public:
    explicit PagesTextEdit(QWidget* parent = 0);

    void setPageFormat(QPageSize::PageSizeId _pageFormat);
    void setPageMargins(const QMarginsF& _margins);
    bool usePageMode() const;

    bool isBold();
    bool isItalic();
    bool isUnderline();

public slots:
    void textFormatBold(bool isChecked);
    void textFormatItalic(bool isChecked);
    void textFormatUnderline(bool isChecked);

    void setUsePageMode(bool _use);
    void setAddSpaceToBottom(bool _addSpace);
    void setShowPageNumbers(bool _show);
    void setPageNumbersAlignment(Qt::Alignment _align);

protected:
    void paintEvent(QPaintEvent* _event);
    void resizeEvent(QResizeEvent* _event);

private:
    void updateViewportMargins();
    void updateVerticalScrollRange();
    void paintPagesView();
    void paintPageNumbers();
    void paintPageNumber(QPainter* _painter, const QRectF& _rect, bool _isHeader, int _number);

private slots:
    void aboutVerticalScrollRangeChanged(int _minimum, int _maximum);
    void aboutDocumentChanged();
    void aboutUpdateDocumentGeometry();
    void aboutMergeCharFormat(QTextCharFormat format);

private:
    QTextDocument* m_document;
    bool m_usePageMode;
    bool m_addBottomSpace;
    bool m_showPageNumbers;
    Qt::Alignment m_pageNumbersAlignment;
    PageMetrics m_pageMetrics;
};

#endif // PAGESTEXTEDIT_H

PagesTextEdit。cp :

#include "PagesTextEdit.h"

#include <QAbstractTextDocumentLayout>
#include <QPainter>
#include <QScrollBar>
#include <QTextFrame>
#include <QTextCharFormat>
#include <QTextCursor> // included

PagesTextEdit::PagesTextEdit(QWidget *parent) :
    QTextEdit(parent),
    m_document(0),
    m_usePageMode(false),
    m_addBottomSpace(true),
    m_showPageNumbers(true),
    m_pageNumbersAlignment(Qt::AlignTop | Qt::AlignRight)
{
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

    aboutDocumentChanged();
    connect(this, SIGNAL(textChanged()), this, SLOT(aboutDocumentChanged()));

    connect(verticalScrollBar(), SIGNAL(rangeChanged(int,int)),
        this, SLOT(aboutVerticalScrollRangeChanged(int,int)));

    setLineWrapMode(QTextEdit::LineWrapMode::WidgetWidth);
}

void PagesTextEdit::setPageFormat(QPageSize::PageSizeId _pageFormat) {
    m_pageMetrics.update(_pageFormat);
    repaint();
}

void PagesTextEdit::setPageMargins(const QMarginsF& _margins) {
    m_pageMetrics.update(m_pageMetrics.pageFormat(), _margins);
    repaint();
}

bool PagesTextEdit::usePageMode() const {
    return m_usePageMode;
}

void PagesTextEdit::setUsePageMode(bool _use) {
    if (m_usePageMode != _use) {
        m_usePageMode = _use;
        repaint();
    }
}

void PagesTextEdit::setAddSpaceToBottom(bool _addSpace) {
    if (m_addBottomSpace != _addSpace) {
        m_addBottomSpace = _addSpace;
        repaint();
    }
}

void PagesTextEdit::setShowPageNumbers(bool _show) {
    if (m_showPageNumbers != _show) {
        m_showPageNumbers = _show;
        repaint();
    }
}

void PagesTextEdit::setPageNumbersAlignment(Qt::Alignment _align) {
    if (m_pageNumbersAlignment != _align) {
        m_pageNumbersAlignment = _align;
        repaint();
    }
}

void PagesTextEdit::paintEvent(QPaintEvent* _event) {
    updateVerticalScrollRange();
    paintPagesView();
        paintPageNumbers();
    QTextEdit::paintEvent(_event);
}

void PagesTextEdit::resizeEvent(QResizeEvent* _event) {
    updateViewportMargins();
    updateVerticalScrollRange();
    QTextEdit::resizeEvent(_event);
}

void PagesTextEdit::updateViewportMargins() {
    QMargins viewportMargins;

    if (m_usePageMode) {

        int pageWidth = m_pageMetrics.pxPageSize().width();
                int pageHeight = m_pageMetrics.pxPageSize().height();

        const int DEFAULT_TOP_MARGIN = 20;
        const int DEFAULT_BOTTOM_MARGIN = 20;
        {
            int leftMargin = 0;
            int rightMargin = 0;

            if (width() > pageWidth) {
                const int BORDERS_WIDTH = 4;
                const int VERTICAL_SCROLLBAR_WIDTH =
                        verticalScrollBar()->isVisible() ? verticalScrollBar()->width() : 0;
                leftMargin = rightMargin =
                        (width() - pageWidth - VERTICAL_SCROLLBAR_WIDTH - BORDERS_WIDTH) / 2;
            }

            int topMargin = DEFAULT_TOP_MARGIN;

            int bottomMargin = DEFAULT_BOTTOM_MARGIN;
            int documentHeight = pageHeight * document()->pageCount();
            if ((height() - documentHeight) > (DEFAULT_TOP_MARGIN   DEFAULT_BOTTOM_MARGIN)) {
                const int BORDERS_HEIGHT = 2;
                const int HORIZONTAL_SCROLLBAR_HEIGHT =
                        horizontalScrollBar()->isVisible() ? horizontalScrollBar()->height() : 0;
                bottomMargin =
                    height() - documentHeight - HORIZONTAL_SCROLLBAR_HEIGHT - DEFAULT_TOP_MARGIN - BORDERS_HEIGHT;
            }

            viewportMargins = QMargins(leftMargin, topMargin, rightMargin, bottomMargin);
        }
    }

    setViewportMargins(viewportMargins);

        aboutUpdateDocumentGeometry();
}

void PagesTextEdit::updateVerticalScrollRange() {
    if (m_usePageMode) {

        const int pageHeight = m_pageMetrics.pxPageSize().height();
        const int documentHeight = pageHeight * document()->pageCount();
        const int maximumValue = documentHeight - viewport()->height();
        if (verticalScrollBar()->maximum() != maximumValue) {
            verticalScrollBar()->setMaximum(maximumValue);
        }
    }
    else {
        const int SCROLL_DELTA = 800;
        int maximumValue =
                document()->size().height() - viewport()->size().height()
                  (m_addBottomSpace ? SCROLL_DELTA : 0);
        if (verticalScrollBar()->maximum() != maximumValue) {
            verticalScrollBar()->setMaximum(maximumValue);
        }
    }
}

void PagesTextEdit::paintPagesView() {
    if (m_usePageMode) {
        qreal pageWidth = m_pageMetrics.pxPageSize().width();
        qreal pageHeight = m_pageMetrics.pxPageSize().height();

        QPainter p(viewport());
        QPen spacePen(palette().window(), 9);
        QPen borderPen(palette().dark(), 1);

        qreal curHeight = pageHeight - (verticalScrollBar()->value() % (int)pageHeight);
        const int x = pageWidth   (width() % 2 == 0 ? 2 : 1);
        const int horizontalDelta = horizontalScrollBar()->value();

        if (curHeight - pageHeight >= 0) {
            p.setPen(borderPen);
            p.drawLine(0, curHeight - pageHeight, x, curHeight - pageHeight);
        }

        while (curHeight <= height()) {
            p.setPen(spacePen);
            p.drawLine(0, curHeight-4, width(), curHeight-4);
            p.setPen(borderPen);
            p.drawLine(0, curHeight-8, x, curHeight-8);
                        p.drawLine(0, curHeight, x, curHeight);
            p.drawLine(0 - horizontalDelta, curHeight - pageHeight, 0 - horizontalDelta, curHeight - 8);
            p.drawLine(x - horizontalDelta, curHeight - pageHeight, x - horizontalDelta, curHeight - 8);

            curHeight  = pageHeight;
        }
        if (curHeight >= height()) {
            p.setPen(borderPen);
            p.drawLine(0 - horizontalDelta, curHeight-pageHeight, 0 - horizontalDelta, height());
            p.drawLine(x - horizontalDelta, curHeight-pageHeight, x - horizontalDelta, height());
        }
    }
}

void PagesTextEdit::paintPageNumbers() {
    if (m_usePageMode && !m_pageMetrics.pxPageMargins().isNull() && m_showPageNumbers) {
        QSizeF pageSize(m_pageMetrics.pxPageSize());
        QMarginsF pageMargins(m_pageMetrics.pxPageMargins());

        QPainter p(viewport());
        p.setFont(document()->defaultFont());
        p.setPen(QPen(palette().text(), 1));
        qreal curHeight = pageSize.height() - (verticalScrollBar()->value() % (int)pageSize.height());
        qreal leftMarginPosition = pageMargins.left() - horizontalScrollBar()->value();
        qreal marginWidth = pageSize.width() - pageMargins.left() - pageMargins.right();
        int pageNumber = verticalScrollBar()->value() / pageSize.height()   1;
        if (curHeight - pageMargins.top() >= 0) {
            QRectF topMarginRect(leftMarginPosition, curHeight - pageSize.height(), marginWidth, pageMargins.top());
            paintPageNumber(&p, topMarginRect, true, pageNumber);
        }
        while (curHeight < height()) {
            QRect bottomMarginRect(leftMarginPosition, curHeight - pageMargins.bottom(), marginWidth, pageMargins.bottom());
            paintPageNumber(&p, bottomMarginRect, false, pageNumber);
              pageNumber;
            QRect topMarginRect(leftMarginPosition, curHeight, marginWidth, pageMargins.top());
            paintPageNumber(&p, topMarginRect, true, pageNumber);
            curHeight  = pageSize.height();
        }
    }
}

void PagesTextEdit::paintPageNumber(QPainter* _painter, const QRectF& _rect, bool _isHeader, int _number) {
    if (_isHeader) {
        if (m_pageNumbersAlignment.testFlag(Qt::AlignTop)) {
            _painter->drawText(_rect, Qt::AlignVCenter | (m_pageNumbersAlignment ^ Qt::AlignTop),
                QString::number(_number));
        }
    }
    else {
        if (m_pageNumbersAlignment.testFlag(Qt::AlignBottom)) {
            _painter->drawText(_rect, Qt::AlignVCenter | (m_pageNumbersAlignment ^ Qt::AlignBottom),
                QString::number(_number));
        }
    }
}

void PagesTextEdit::aboutVerticalScrollRangeChanged(int _minimum, int _maximum) {
    Q_UNUSED(_minimum);
    updateViewportMargins();

    int scrollValue = verticalScrollBar()->value();
    if (scrollValue > _maximum) {
        updateVerticalScrollRange();
    }
}

void PagesTextEdit::aboutDocumentChanged() {
    if (m_document != document()) {
        m_document = document();
        connect(document()->documentLayout(), SIGNAL(update()), this, SLOT(aboutUpdateDocumentGeometry()));
    }
}

void PagesTextEdit::aboutUpdateDocumentGeometry() {
    QSizeF documentSize(width() - verticalScrollBar()->width(), -1);
    if (m_usePageMode) {
        int pageWidth = m_pageMetrics.pxPageSize().width();
        int pageHeight = m_pageMetrics.pxPageSize().height();
        documentSize = QSizeF(pageWidth, pageHeight);
    }
    if (document()->pageSize() != documentSize) {
        document()->setPageSize(documentSize);
    }

    if (document()->documentMargin() != 0) {
        document()->setDocumentMargin(0);
    }
    QMarginsF rootFrameMargins = m_pageMetrics.pxPageMargins();
    QTextFrameFormat rootFrameFormat = document()->rootFrame()->frameFormat();
    if (rootFrameFormat.leftMargin() != rootFrameMargins.left()
        || rootFrameFormat.topMargin() != rootFrameMargins.top()
        || rootFrameFormat.rightMargin() != rootFrameMargins.right()
        || rootFrameFormat.bottomMargin() != rootFrameMargins.bottom()) {
        rootFrameFormat.setLeftMargin(rootFrameMargins.left());
        rootFrameFormat.setTopMargin(rootFrameMargins.top());
        rootFrameFormat.setRightMargin(rootFrameMargins.right());
        rootFrameFormat.setBottomMargin(rootFrameMargins.bottom());
        document()->rootFrame()->setFrameFormat(rootFrameFormat);
    }
}

void PagesTextEdit::aboutMergeCharFormat(QTextCharFormat format) {
    // no problem
    QTextCursor cur = textCursor();
    if (!cur.hasSelection()) {
        cur.select(QTextCursor::SelectionType::WordUnderCursor);
    }
    cur.mergeCharFormat(format);
}

void PagesTextEdit::textFormatBold(bool isChecked) {
    // no problem
    QTextCharFormat form;
    if (isChecked) {
        int weight = QFont::Bold;
        form.setFontWeight(weight);
    } else {
        int weight = QFont::Normal;
        form.setFontWeight(weight);
    }
    aboutMergeCharFormat(form);
}

void PagesTextEdit::textFormatItalic(bool isChecked) {
    // no problem
    QTextCharFormat form;
    if (isChecked) {
        bool italic = true;
        form.setFontItalic(italic);
    } else {
        bool italic = false;
        form.setFontItalic(italic);
    }
    aboutMergeCharFormat(form);
}

void PagesTextEdit::textFormatUnderline(bool isChecked) {
    // no problem
    QTextCharFormat form;
    if (isChecked) {
        bool underline = true;
        form.setFontUnderline(underline);
    } else {
        bool underline = false;
        form.setFontUnderline(underline);
    }
    aboutMergeCharFormat(form);
}

bool PagesTextEdit::isBold() {
    bool bold = false;

    QTextCursor cursor = textCursor(); // problem here
    // Refer to the pictures...
    // QTextCursor: <no such value>
    // textCursor: <no such value>

    // BUT I truthly included ALL the QTextCursors and QTextEdits in above

    if (cursor.hasSelection()) {
        int selectionStart = (cursor.selectionStart()   1);
        int selectionEnd = (cursor.selectionEnd()   1);

        for (int pos = selectionStart; pos < selectionEnd; pos  ) {
            cursor.setPosition(pos);
            QTextCharFormat form = cursor.charFormat();
            if (form.fontWeight() >= QFont::Bold) {
                bold = true;
            } else {
                bold = false;
                break;
            }
        }
    } else {
        bold = (cursor.charFormat().fontWeight() >= QFont::Bold);
    }

    return bold;
}

任何建議將不勝感激!!!謝謝!

uj5u.com熱心網友回復:

讓我看看你的代碼...

此代碼與物件繼承無關,而是與標頭/源代碼控制有關。利用

//directly without using such useless shadow declarations
m_menuFormat = new QMenu(this);
m_menuFormat->setTitle('format');
m_menuBar->addMenu(m_menuFormat);

代替

//go ahead with python or java but don't trouble cpp
MenuFormat m_menuFormat;
//unless u want to see 15:49:26: /Users/Scott/Documents/test/test.app/Contents/MacOS/test crashed.
m_menuFormat = ...;
...;

雖然必須確保 m_menuFormat 出現在頭檔案串列中。

別緊張。

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531681.html

標籤:C qtqt-创作者qtexteditqtextcursor

上一篇:在QML中突出顯示圓段的最佳方法?

下一篇:Qt應用程式掛起process.start()函式。僅在從QML腳本呼叫函式時發生

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more