вызываю paintevent самостоятельно в другом классе в qt c

#c #qt #paintevent

#c #qt #paintevent

Вопрос:

Я новичок в qt и делаю визуализацию красно-черного дерева с использованием qt c . я создал структуру узла, используя Qpaint, и у меня готов базовый код дерева структуры данных, единственная проблема заключается в обновлении события paint, потому что я тоже хочу вызывать событие paint, когда захочу.

а также при рисовании мои начальные узлы исчезают. пожалуйста, ознакомьтесь с кодом и помогите.

код является:

 //dispaymenu.cpp

#include "displaymenu.h"
#include "ui_displaymenu.h"
#include "datastruct.cpp"
#include<QtCore>
#include<QtGui>

DisplayMenu::DisplayMenu(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::DisplayMenu)
{
    ui->setupUi(this);

}
DisplayMenu::~DisplayMenu()
{
    delete ui;
}
void DisplayMenu::paintEvent(QPaintEvent *)
{
        createNode(text,col);
}

void DisplayMenu::createNode(QString text,char col)
{

    QRectF rect(x,y,80,80);    //create rectangle object which is not seen
    QPainter p(this);
    if(col=='b')
        p.setBrush(Qt::black);
    else if(col=='r')
        p.setBrush(Qt::red);
    p.drawEllipse(rect);        //circle fits into the rect passed
    p.setPen(Qt::white);
    p.setFont(QFont("Arial", 15));      //to set font and size of text
    p.drawText(rect, Qt::AlignCenter,text);
}

void DisplayMenu::setText()
{
    bool ok;
    text = QInputDialog::getText(this, tr("getText()"),
                                         tr("getdata:"), QLineEdit::Normal,
                                         QDir::home().dirName(), amp;ok);
    if (ok amp;amp; !text.isEmpty())
    {
        int ele=text.toInt();
        RBTree t1(a);
        col=t1.insert(ele);
        a=1;
        createNode(text,col);
    }
}


void DisplayMenu::on_textButton_clicked()
{
    setText();
}

this was our mainwindow file.

//main.cpp
#include "displaymenu.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    displaymenu w;
    w.show();

    return a.exec();
}


//datastruct.cpp

#include <bits/stdc  .h>
#include<datastruct.h>
#include<displaymenu.h>
#include"displaymenu.cpp"


using namespace std;

enum Color {RED, BLACK};

struct Node
{
    int data;
    char color;
    Node *left, *right, *parent;

    // Constructor
    Node(int data)
    {
        this->data = data;
        this->color='r';
        left = right = parent =nullptr;
    }
};

// Class to represent Red-Black Tree
class RBTree
{
public:
    Node *root;
    void rotateLeft(Node *amp;, Node *amp;);
    void rotateRight(Node *amp;, Node *amp;);
    void fixViolation(Node *amp;, Node *amp;);


    // Constructor
    RBTree(int a)
    {
        if(a==0)
            root = nullptr;
    }
    char insert(int ele);
    //void inorder();
    //void levelOrder();
};
Node* BSTInsert(Node* root, Node *pt)
{
    //DisplayMenu d(amp;p);
    /* If the tree is empty, return a new node */
    if (root == nullptr)
    {
        pt->color='b';
        return pt;
    }


    /* Otherwise, recur down the tree */
    if (pt->data < root->data)
    {
        root->left = BSTInsert(root->left, pt);
        root->left->parent = root;
    }
    else if (pt->data > root->data)
    {
        root->right = BSTInsert(root->right, pt);
        root->right->parent = root;
    }

    /* return the (unchanged) node pointer */
    return root;
}
char RBTree::insert(int data)
{
    Node *pt = new Node(data);

    // Do a normal BST insert
    root=BSTInsert(root, pt);
    return pt->color;

    // fix Red Black Tree violations
    //fixViolation(root, pt);
}
  

Комментарии:

1. какой код у вас есть?

2. Добавил код к описанию. пожалуйста, проверьте, 🙂

Ответ №1:

Вызываю QWidget::update() , чтобы создать новое событие рисования в вашем виджете. Событие будет обработано циклом событий как можно скорее.

Вы также можете принудительно выполнить вызов repaint QWidget::repaint , но вы остановите цикл событий (так что, только если вам нужно мгновенное перерисовывание).

Комментарии:

1. сделал, но моя программа дает сбой. пожалуйста, вы можете проверить код и сказать, что не так. 🙂