Кодим с wxWidgets
Moderator: Shaos
-
- Maniac
- Posts: 298
- Joined: 10 Dec 2008 08:39
- Location: Стокгольм, Швеция
Re: Кодим с wxWidgets
Я давно не копался с wxWidgets, так как подсел на Qt начиная со второй версии. Но, на всех *NIX системах отрисовкой занимался порт wxGTK. Думаю и сейчас точно так же.
С уважением, Сергей.
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
Угу - у меня стоит GTK+ прослойка для wx
P.S. По поводу Qt - он вроде бы везде выглядит одинаково, но по сравнению с нативными контролами операционок где он крутится, оно скороее выглядит как детские мультики - плюс несовместимости от версии к версии и необходимости скачивать гигабайты официальных дистров с сайта создателей при каждом апгрейде - короче я с Qt поработал (в том же 2019 году) и решил туда больше не возвращаться...
P.S. По поводу Qt - он вроде бы везде выглядит одинаково, но по сравнению с нативными контролами операционок где он крутится, оно скороее выглядит как детские мультики - плюс несовместимости от версии к версии и необходимости скачивать гигабайты официальных дистров с сайта создателей при каждом апгрейде - короче я с Qt поработал (в том же 2019 году) и решил туда больше не возвращаться...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
Интересный косяк в виндовой сборке моего последнего теста - если в линуксе оно в DC точно под мышкой рисовало, то в винде (и в Wine) оно рисует выше примерно на высоту тулбара:
P.S. Отладка показывает, что при кликаньи приходят правильные координаты когда вертикальная координата 0 находится ниже тулбара, однако когда делается блиттинг в 0,0 то оно в винде рисует как бы под тулбаром (в линуксе всё ок - блиттинг тоже начинается ниже тулбара).
P.P.S. Универсально получилось вот так:
Начало клиентского прямоугольника в винде выходит (0,32), а в линухе - (0,0)
P.P.P.S. Ещё под виндой было мерцание при каждой перерисовке - починилось через добавление пустого обработчика OnEraseBackground(…)
P.S. Отладка показывает, что при кликаньи приходят правильные координаты когда вертикальная координата 0 находится ниже тулбара, однако когда делается блиттинг в 0,0 то оно в винде рисует как бы под тулбаром (в линуксе всё ок - блиттинг тоже начинается ниже тулбара).
P.P.S. Универсально получилось вот так:
Code: Select all
void MyFrame::OnPaint(wxPaintEvent& event)
{
wxRect r = GetClientRect();
wxPaintDC dc(this);
// dc.SetClippingRegion(GetUpdateRegion());
dc.Blit(r.x, r.y, r.width, r.height, memdc, 0, 0);
char str[100];
sprintf(str,"Paint %d:%d-%d:%d\n",r.x,r.y,r.width,r.height);
SetStatusText(str);
}
P.P.P.S. Ещё под виндой было мерцание при каждой перерисовке - починилось через добавление пустого обработчика OnEraseBackground(…)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 298
- Joined: 10 Dec 2008 08:39
- Location: Стокгольм, Швеция
Re: Кодим с wxWidgets
О, я с Qt работаю с 2003 года...
Сейчас, кстати, она модульная. Причём, настолько хорошо конфигурируется, что, например, использую её в проектах со встроенным Linux, под i.MX6ULL.
Сейчас, кстати, она модульная. Причём, настолько хорошо конфигурируется, что, например, использую её в проектах со встроенным Linux, под i.MX6ULL.
С уважением, Сергей.
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
За Embedded насколько я помню Qt берёт большие бабки…
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 298
- Joined: 10 Dec 2008 08:39
- Location: Стокгольм, Швеция
Re: Кодим с wxWidgets
Это если надо что-то из коммерческих либ. А так сама базовая часть под LGPL.
С уважением, Сергей.
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
Ну embedded отрисовка в Qt вся коммерческая была в 2019 году, не?…
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
Теперь другая напасть - уже в линухе - координаты клика мышью там считаются от тулбара (т.е. уже минус 32 пиксела), однако похоже при обработке мышиных событий проверки на выход за пределы рабочего поля окна не происходит и если я "порисую" на статусбаре и потом увеличу окно, то увижу, что там таки чото нарисовалось (в винде такого нету т.к. тулбар не учитывается)...Shaos wrote: 23 Feb 2025 23:08 P.S. Отладка показывает, что при кликаньи приходят правильные координаты когда вертикальная координата 0 находится ниже тулбара, однако когда делается блиттинг в 0,0 то оно в винде рисует как бы под тулбаром (в линуксе всё ок - блиттинг тоже начинается ниже тулбара).
P.P.S. Универсально получилось вот так:Начало клиентского прямоугольника в винде выходит (0,32), а в линухе - (0,0)Code: Select all
void MyFrame::OnPaint(wxPaintEvent& event) { wxRect r = GetClientRect(); wxPaintDC dc(this); // dc.SetClippingRegion(GetUpdateRegion()); dc.Blit(r.x, r.y, r.width, r.height, memdc, 0, 0); char str[100]; sprintf(str,"Paint %d:%d-%d:%d\n",r.x,r.y,r.width,r.height); SetStatusText(str); }
P.S. Вставил проверку на попадание в клиентские размеры - теперь вроде всё ок и там, и там:
Code: Select all
// wxWidgets sample #6
#include <wx/wx.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifdef __WXUNIVERSAL__
#include <wx/univ/theme.h>
#endif
enum
{
wxID_COMPILE = wxID_HIGHEST+1,
wxID_EXPLODE
};
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
class MyFrame : public wxFrame
{
int current_width;
int current_height;
int memdc_width;
int memdc_height;
wxMemoryDC *memdc;
wxBitmap *bm;
public:
MyFrame(const wxString& title);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnSize(wxSizeEvent& event);
void OnMotion(wxMouseEvent& event);
void OnPaint(wxPaintEvent& event);
void OnEraseBackground(wxEraseEvent& event);
private:
DECLARE_EVENT_TABLE()
};
DECLARE_APP(MyApp)
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame(wxT("My wxWidets App"));
frame->Show(true);
return true;
}
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
EVT_SIZE( MyFrame::OnSize)
EVT_MOTION( MyFrame::OnMotion)
EVT_PAINT( MyFrame::OnPaint)
EVT_ERASE_BACKGROUND(MyFrame::OnEraseBackground)
END_EVENT_TABLE()
void MyFrame::OnAbout(wxCommandEvent& event)
{
wxString msg;
msg.Printf(wxT("Hello and welcome to %s"), wxVERSION_STRING);
wxMessageBox(msg, wxT("About wxWidgets"), wxOK | wxICON_INFORMATION, this);
}
void MyFrame::OnQuit(wxCommandEvent& event)
{
Close();
}
void MyFrame::OnSize(wxSizeEvent& event)
{
wxSize size = GetClientSize();
current_width = size.GetWidth();
current_height = size.GetHeight();
char str[20];
sprintf(str,"OnSize %d:%d",current_width,current_height);
SetStatusText(str);
}
void MyFrame::OnMotion(wxMouseEvent& event)
{
if(event.Dragging())
{
wxPoint point = event.GetPosition();
// printf("Draw %d:%d\n",point.x,point.y);
if(point.x < current_width && point.y < current_height)
{
wxPen pen(*wxBLACK, 1);
memdc->SetPen(pen);
memdc->DrawPoint(point);
memdc->SetPen(wxNullPen);
Refresh();
}
}
}
void MyFrame::OnPaint(wxPaintEvent& event)
{
wxRect r = GetClientRect();
wxPaintDC dc(this);
// dc.SetClippingRegion(GetUpdateRegion());
dc.Blit(r.x, r.y, r.width, r.height, memdc, 0, 0);
char str[100];
sprintf(str,"Paint %d:%d-%d:%d (%d:%d)",r.x,r.y,r.width,r.height,current_width,current_height);
SetStatusText(str);
}
void MyFrame::OnEraseBackground(wxEraseEvent& event)
{
}
const
#include "icon16x16.xpm"
const
#include "icon20x20_new.xpm"
const
#include "icon20x20_open.xpm"
const
#include "icon20x20_save.xpm"
const
#include "icon20x20_cut.xpm"
const
#include "icon20x20_copy.xpm"
const
#include "icon20x20_paste.xpm"
const
#include "icon20x20_compile.xpm"
const
#include "icon20x20_explode.xpm"
MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title)
{
SetIcon(wxIcon(icon16x16_xpm));
wxMenu *fileMenu = new wxMenu;
wxMenu *helpMenu = new wxMenu;
helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"), wxT("Show about dialog"));
fileMenu->Append(wxID_EXIT, wxT("E&xit...\tAlt-X"), wxT("Quit this program"));
wxMenuBar *menuBar = new wxMenuBar();
menuBar->Append(fileMenu, wxT("&File"));
// menuBar->Append(helpMenu, wxT("&Edit"));
// menuBar->Append(helpMenu, wxT("&Compile"));
// menuBar->Append(helpMenu, wxT("&Run"));
menuBar->Append(helpMenu, wxT("&Help"));
SetMenuBar(menuBar);
CreateStatusBar(2);
SetStatusText(wxT("Welcome to wxWidgets!"));
wxToolBar* toolBar = new wxToolBar(this, wxID_ANY,
wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL|wxNO_BORDER);
wxBitmap bmpNew (icon20x20_new_xpm);
wxBitmap bmpOpen (icon20x20_open_xpm);
wxBitmap bmpSave (icon20x20_save_xpm);
wxBitmap bmpCut (icon20x20_cut_xpm);
wxBitmap bmpCopy (icon20x20_copy_xpm);
wxBitmap bmpPaste (icon20x20_paste_xpm);
wxBitmap bmpCompile(icon20x20_compile_xpm);
wxBitmap bmpExplode(icon20x20_explode_xpm);
toolBar->AddTool (wxID_NEW, bmpNew, wxT("New"));
toolBar->AddTool (wxID_OPEN, bmpOpen, wxT("Open"));
toolBar->AddTool (wxID_SAVE, bmpSave, wxT("Save"));
toolBar->AddSeparator();
toolBar->AddTool (wxID_CUT, bmpCut, wxT("Cut"));
toolBar->AddTool (wxID_COPY, bmpCopy, wxT("Copy"));
toolBar->AddTool (wxID_PASTE, bmpPaste, wxT("Paste"));
toolBar->AddSeparator();
toolBar->AddTool (wxID_COMPILE, bmpCompile, wxT("Compile"));
toolBar->AddTool (wxID_EXPLODE, bmpExplode, wxT("Execute"));
toolBar->Realize();
SetToolBar(toolBar);
memdc = new wxMemoryDC;
memdc_width = 2048;
memdc_height = 2048;
bm = new wxBitmap(memdc_width,memdc_height,-1);
memdc->SelectObject(*bm);
memdc->SetBackground(*wxWHITE_BRUSH);
memdc->Clear();
GetSize(¤t_width,¤t_height);
}
P.P.S. Теперь надо на маке поглядеть как оно будет и можно начать прикручивать скроллы...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
На маке ещё смешнее - можно продолжать вести курсор с нажатием далеко за пределы окна и потом увеличив окно можно увидеть, что оно там тоже нарисовалоShaos wrote: 24 Feb 2025 19:23 Теперь другая напасть - уже в линухе - координаты клика мышью там считаются от тулбара (т.е. уже минус 32 пиксела), однако похоже при обработке мышиных событий проверки на выход за пределы рабочего поля окна не происходит и если я "порисую" на статусбаре и потом увеличу окно, то увижу, что там таки чото нарисовалось (в винде такого нету т.к. тулбар не учитывается)...

P.S. Ещё выяснилось что в wxWidgets-3.2.6, что у меня на маке, уже нельзя использовать старый вариант AddTool - надо переписать тесты 5 и 6 на использование нового варианта...
P.P.S. Попробовал новый "расширенный" вариант AddTool - оно собралось, но тулбар так и не появился...
P.P.P.S. Вот тут описаны особенности работы wxWidgets в макоси:
https://wiki.wxwidgets.org/WxMac-specific_topics
Интересно, что раньше wxWidgets входили в поставку MacOS X:
- 10.4 has wxWidgets 2.5
- 10.5 has wxWidgets 2.8.4
- 10.6 has wxWidgets 2.8.8
- 10.7 does not ship with wxWidgets. Apps linked to system libraries on 10.4-10.6 will not run.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
Решил я на свой яблосиликон поставить wxWidgets-3.0.5 (как в дебияне 11) напрямую собрав из сырцов (а не через brew как в прошлый раз) - делал вот по этой инструкции:
https://docs.wxwidgets.org/3.2/plat_osx_install.html
но конфигурил вот так (чтобы были статические сборки):
В моём примере тулбар так и не появился, но вот тест toolbar из поставки wx запустился вот в таком виде:
т.е. тулбар воткнулся в заголовок окна (а вот при попытке поиграть флажками, чтобы добавить второй вертикальный тулбар, оно упало)...
P.S. Вот для сравнения как выглядит тот же самый тест toolbar в том же самом wxWidgets-3.0.5 на линухе:
и с включённым вторым тулбаром:
https://docs.wxwidgets.org/3.2/plat_osx_install.html
но конфигурил вот так (чтобы были статические сборки):
Code: Select all
../configure --with-osx_cocoa --with-macosx-version-min=11.0 --with-macosx-sdk=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk --disable-shared --enable-macosx-arch=arm64
т.е. тулбар воткнулся в заголовок окна (а вот при попытке поиграть флажками, чтобы добавить второй вертикальный тулбар, оно упало)...
P.S. Вот для сравнения как выглядит тот же самый тест toolbar в том же самом wxWidgets-3.0.5 на линухе:
и с включённым вторым тулбаром:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 298
- Joined: 10 Dec 2008 08:39
- Location: Стокгольм, Швеция
Re: Кодим с wxWidgets
Так мне GUI и не нужно. Мне нужно QtCore, QtNetwork, и прочие.
С уважением, Сергей.
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
Хм, а нафиг Qt нужен если без GUI?

QList использовать вместо std::list?

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 298
- Joined: 10 Dec 2008 08:39
- Location: Стокгольм, Швеция
Re: Кодим с wxWidgets
Контейнеры это только часть. Самое главное - это динамическое связывание и сигналы-слоты. А ещё платформонезависимые абстракции к сокетам, файлам, портам, базам данных и прочему. Опять же, относительно легко реализовать поддержку принтеров, которые печатают промышленные этикетки (Brady, например). У них родной софт с весьма кривой и костыльной интеграцией со сторонними системами. И всё это расширяемо, можно написать свои специфические протоколы. Интеграция с тем же J-Link и прочими программаторами.Shaos wrote: 28 Feb 2025 14:49 Хм, а нафиг Qt нужен если без GUI?
QList использовать вместо std::list?![]()
Для внутренних проектов, типа софта для тестирования и программирования железок на производстве, это незаменимо. А гуй в этом случае вообще - веб-страница. Всё крутится в коробке, которая прикручена к стенду Ingun, например. Она воткнута в локалку, а на комп тестировщика вообще ничего не ставится.
С уважением, Сергей.
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Кодим с wxWidgets
а самим эту прослойку написать чтобы не зависеть от чужих глюков?
кстати наша контора потратила несколько лет, чтобы отовсюду выпилить следы Qt
кстати наша контора потратила несколько лет, чтобы отовсюду выпилить следы Qt
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 298
- Joined: 10 Dec 2008 08:39
- Location: Стокгольм, Швеция
Re: Кодим с wxWidgets
В одно лицо не потяну. И так всё от прошивок конечных устройств до шлюзов на мне. Ещё и PIC-ассемблер недавно нарисовался. Никогда с ними не сталкивался, а тут пришлось.
Boost не предлагать. Вот это уж "поделие" так "поделие"... Ещё и тормозное.
Boost не предлагать. Вот это уж "поделие" так "поделие"... Ещё и тормозное.
С уважением, Сергей.