Как нарисовать линию при нажатии кнопки в Qt? [Дубликат]

Две функции делают разные вещи!

Метод resize() (и передающий аргумент конструктору эквивалентен этому) будет вставлять или удалять соответствующее количество элементов в вектор, чтобы сделать его заданным размером (у него есть необязательный второй аргумент, чтобы указать их значение). Это повлияет на size(), итерация пойдет по всем этим элементам, push_back вставляет после них, и вы можете напрямую обращаться к ним с помощью operator[].

reserve() только выделяет память, но оставляет ее неинициализированной. Это влияет только на capacity(), но size() не изменится. Для объектов нет значения, потому что ничего не добавляется к вектору. Если вы вставляете элементы, перераспределение не произойдет, потому что это было сделано заранее, но это единственный эффект.

Так что это зависит от того, что вы хотите. Если вам нужен массив из 1000 элементов по умолчанию, используйте resize(). Если вам нужен массив, в который вы ожидаете вставить 1000 элементов, и хотите избежать нескольких распределений, используйте reserve().

EDIT: комментарий Бластфурнаса заставил меня снова прочитать вопрос и понять, что в вашем Если правильный ответ не будет предварительно распределен вручную. Просто продолжайте вставлять элементы в конце по мере необходимости. Вектор будет автоматически перераспределяться по мере необходимости и будет делать это больше эффективно, чем упомянутый ручной способ. Единственный случай, когда reserve() имеет смысл, - это когда вы имеете достаточно точную оценку общего размера, который вам будет легко доступен заранее.

EDIT2: Редактирование вопроса: если у вас есть первоначальная оценка, тогда reserve(), которые оцениваются. Если этого оказалось недостаточно, просто дайте вектору сделать это.

3
задан Ufx 25 June 2015 в 02:28
поделиться

3 ответа

Вы не можете рисовать вне функции paintEvent(), по крайней мере, в Windows и Mac OS. Однако вы можете переопределить функцию MainWindow класса paintEvent() класса, чтобы провести там линию. Например:

class Widget : public QWidget
{
protected:
    void paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
        painter.drawLine(0, 0, 200, 200);
    }
};

И использование:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Widget w;
    w.show();
    [..]
9
ответ дан vahancho 16 August 2018 в 04:05
поделиться

Виджеты можно нарисовать только в соответствующем событии рисования. Вы можете нарисовать пиксельную карту в любой функции, но вам нужно показать результат в событии рисования виджета.

Из документа doc:

Warning: Когда устройство рисования виджет, QPainter может использоваться только внутри функции paintEvent () или в функции, вызванной paintEvent (); то есть, если не установлен атрибут виджета Qt :: WA_PaintOutsidePaintEvent.

0
ответ дан dtech 16 August 2018 в 04:05
поделиться

Вы не можете рисовать виджет вне события рисования. Но вы можете рисовать в любое время не-виджет, например, на QImage, QPixmap или QPicture. Таким образом, это работает:

enter image description here [/g0]

#include <QApplication>
#include <QLabel>
#include <QPicture>
#include <QPainter>

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QLabel l;
   QPicture pi;
   QPainter p(&pi);

   p.setRenderHint(QPainter::Antialiasing);
   p.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
   p.drawLine(0, 0, 200, 200);
   p.end(); // Don't forget this line!

   l.setPicture(pi);
   l.show();
   return a.exec();
}
8
ответ дан Kuba Ober 16 August 2018 в 04:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: