crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Ничего не получается с рисованием на виджете
Litkevich Yuriy
  опции профиля:
сообщение 24.4.2008, 17:54
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ну размести рисунок на одном виджете, и воткни его в тот на котором кнопки.
Вот Layout (компоновщик) может сам как надо отрегулировать:
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()
    
  QWidget            window;
  QPushButton        btn(QObject::tr("Ку-ку"));
  PainterPathWidget wgt;
  QVBoxLayout        *mainLayout = new QVBoxLayout;


    //wgt.resize(200, 200);
    wgt.setMinimumSize(200, 200);
    mainLayout->addWidget(&btn);
    mainLayout->addWidget(&wgt);
    window.setLayout(mainLayout);


    //wgt.show();
    window.show();

    return app.exec();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 24.4.2008, 18:23
Сообщение #12


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Понял спасибо!
А почеиу текст нужно выводить именно через tr()? Почему нельзя просто
QPushButton btn("Text");?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.4.2008, 18:27
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Я пишу в кодировке UTF-8, но строковые переменные использую в виндовозовской кодировке, иниче возникают проблемы с БД, которые я еще не победил, чтобы Qt'я могло использовать разные кодировки в разных местах, я делаю так:
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));// 
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()

тогда константы строковые помещаю в tr(), она в UTF-8, остальное Windows-1251

Если текст программы в виндовозовской кодировке, то вторую строку можешь не писать, и tr() не использовать, но лучше использовать, чтобы небыло проблем в будущем, в частности с горячими кнопками при разных раскладках клавиатуры.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 24.4.2008, 20:17
Сообщение #14


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Как нарисовать дугу? Пытался через drawArc(), не получается - выводится точка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.4.2008, 20:28
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а как ты это делал? приведи код
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 24.4.2008, 20:37
Сообщение #16


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 24.4.2008, 20:28) *
а как ты это делал? приведи код


Ну вот вся прога:

class Life : public QWidget 
{
protected:
    virtual void paintEvent(QPaintEvent*)
    {
        QPainter paint(this);
        paint.drawArc(40,40,50,50,25,25);  <======================
                        
                       //пытался ещё через Безье, но никогда так не делал и не знаю, что обозначают все передаваемые значения
                       QPainterPath path;                          
        path.moveTo( 80,320);        
        path.cubicTo(200,400,320,400,480,320);
        paint.drawPath(path);
                
    }
public:
    Life(QWidget* pwgt = 0) : QWidget(pwgt)
    {
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);
    QWidget window;
    Life a;
    QHBoxLayout lay;
    lay.addWidget(&a);
    window.setLayout(&lay);
    window.show();
    return app.exec();
}
Причина редактирования: используй кнопку &quot;Код&quot; ([code=cpp])
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.4.2008, 21:07
Сообщение #17


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Смотри для начала рабочий пример в каталоге %QTDIR%\examples\painting\basicdrawing, там есть дуги, а тут его описание Basic Drawing Example

руководство по функции:
Цитата
void QPainter::drawArc ( const QRectF & rectangle, int startAngle, int spanAngle )
Draws the arc defined by the given rectangle, startAngle and spanAngle.
The startAngle and spanAngle must be specified in 1/16th of a degree, i.e. a full circle equals 5760 (16 * 360). Positive values for the angles mean counter-clockwise while negative values mean the clockwise direction. Zero degrees is at the 3 o'clock position.

Пример, от туда
 QRectF rectangle(10.0, 20.0, 80.0, 60.0);
int startAngle = 30 * 16;
int spanAngle = 120 * 16;

QPainter painter(this);
painter.drawArc(rectangle, startAngle, spanAngle);

сравни цифры startAngle и spanAngle, со своими
остальное должно работать,
Модификация примера Макса Шлее:
virtual void paintEvent(QPaintEvent*)
{
    int startAngle = 30 * 16;    //    480
    int spanAngle = 120 * 16;    //    
    
    QPainter painter(this);
    painter.drawArc(40, 40, 50, 50, startAngle, spanAngle);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 24.4.2008, 21:09
Сообщение #18


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 24.4.2008, 20:39) *
Смотри для начала рабочий пример в каталоге %QTDIR%\examples\painting\basicdrawing, там есть дуги, а тут его описание Basic Drawing Example


Вот тот код который рисует дугу из примера:
QRect rect(10, 20, 80, 60) // я так понял задаётся прямоугольник в который вписывается эллипс
int startAngle = 30 * 16;
int arcLength = 120 * 16;
painter.drawArc(rect, startAngle, arcLength);

Ввёл в свою прогу, нарисовалась такая же дуга. Но как работать с этими углами? Шаманю со множителями, получаются куски эллипса, причём каждый раз кординально разные. Мне нужно нарисовать просто улыбочку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.4.2008, 21:19
Сообщение #19


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


смотри мой предыдущий пост.

startAngle и spanAngle должны быть определены в ед. 1/16-ой градуса, т.е. полная окружность равна 5760 (16 * 360). Положительное значение углов означает направление против часовой стрелки, а отрицательное - по часовой. Нуль градусов находится в позиции 3 часа.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Don
  опции профиля:
сообщение 19.5.2008, 20:38
Сообщение #20


Студент
*

Группа: Новичок
Сообщений: 59
Регистрация: 19.3.2008
Пользователь №: 127

Спасибо сказали: 0 раз(а)




Репутация:   0  


Смотрите, все что рисуется на форме должно находится в функции paintEvent(). Допустим рисуются какие-то объекты по предворительным рсчётам, которые проводятся в другой функции. И если вызвать в этой фукции функцию repaint(), то происходит перерисовка с учётом расчётов. Получется функция repaint() вызывает функцию paintEvent(). Так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.5.2022, 22:48