Qt łączenie okien za pomocą sygnałów

Qt łączenie okien za pomocą sygnałów
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0

Witam,
Tak więc pisze program który, wywołuje widgety i potrzebne mi przesyłanie wartości do tego widgetu
zrobiłem to za pomocą sygnału no ale nie wiem czy dobrze to robie bo wywala mi pełno błędów i za każdym razem jak próbuje je naprawić pojawiają się nowe :p
wzorowałem się na http://stackoverflow.com/questions/6199962/how-to-pass-data-from-one-form-to-another-in-qt
fragment kodu:
Oknogłówne
-plik .h

Kopiuj
 signals:

    void tableNameEntered(const QString &text);

-pli.cpp konstruktor

Kopiuj
connect(ui->listWidget->itemDoubleClicked(), SIGNAL(doubleClicked(QModelIndex)),this, SIGNAL(on_listWidget_itemDoubleClicked()));

pli.cpp funkcja

Kopiuj
 void okno::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{

    Elementy*o = new Elementy();

    QObject::connect(this, SIGNAL(tableNameEntered(const QString&)),
                         &o, SLOT(onNewTextEntered(const QString&)));

    emit this->tableNameEntered(item->text());

    o->show();
}

a w Widget mam tak:
-plik .h

Kopiuj
     
private slots:
    void onTableNameEntered(const QString &text);

-plik.cpp

Kopiuj
void SecondForm::onNewTextEntered(const QString &text)
{
    this->setWindowTitle(text);
} 

tak to zrobiłem wzorując się na tamtej stronie.
ale generuje mi błędy:
problemy_jpg_300x300_q85.jpg

MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
0

łączysz sygnał ze sygnałem! " SIGNAL(on_listWidget_itemDoubleClicked()) " to jest na pewno, źle bo już po nazwie "on_*" widać, że to jest slot.
SIGNAL/SLOT to jest makra, które dopisują na początek 0 lub 1 dla odróżnienia slotów i sygnałów.

na dodatek "ui->listWidget->itemDoubleClicked()" to chyba za dużo, czy tam nie powinno być ui->listWidget.

Podsumowując:

Kopiuj
connect(ui->listWidget, SIGNAL(doubleClicked(QModelIndex)),this, SLOT(on_listWidget_itemDoubleClicked()));

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
MA
Nie istnieją żadne przeciwskazania łączenia sygnału z sygnałem. Nie jest to nagminna praktyka ale mechanizm jest jak najbardziej do tego przystosowany, nie ma w tym nic złego i sam niejednokrotnie z tego korzystałem.
MarekR22
tak, ale używanie makra SIGNAL na slocie to już jest źle.
MA
Wybacz, nie spałem. Nie wnikam głębiej w sens wypowiedzi. Tak tylko rzuciło mi się w oczy oburzenie łączenia sygnału z sygnałem jakby to był błąd. Mea culpa.
MA
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 10 lat
0

Czytaj błędy ze zrozumieniem:

  1. Funkcja itemDoubleClicked nie ma wersji bezparametrowej. Musisz przekazać jej argument typy QListWidgetItem*. W takim wydaniu jak to masz musiałbyś łączyć to dla każdego QListWidgetItem jaki dodajesz. Lepiej jest wyłapywać sygnał kliknięcia na widoku i za jego pomocą wyłuskać z QModelIndex to który item został kliknięty.
  2. Okno musi dziedziczyć po QObject. Inaczej nie może korzystac z funkcji connect, nieprawdaż?

Zero litości dla nieróbstwa.
edytowany 1x, ostatnio: Malootki
SH
Ok, to ja staram się wprowadzić wasze wskazówki
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
0

Jak jeszcze patrze co wypatrzył Malootki, to stwierdzam, że cały kod to totalna kaszana, pokaż lepiej całość, bo już widzę, że masz więcej kwiatków (szczególnie, że na zrzucie ekranu masz błędy kompilacji).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
MA
Nawet nie patrzyłem w ten kod :). Wystarczyły mi komunikaty błędów.
SH
Ok, to ja staram się wprowadzić wasze wskazówki
SH
a co do całości to działała bez zarzutu :) zanim chciałem przekazywać wartość przez sygnały.
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0
Malootki napisał(a):

Czytaj błędy ze zrozumieniem:

  1. Funkcja itemDoubleClicked nie ma wersji bezparametrowej. Musisz przekazać jej argument typy QListWidgetItem*. W takim wydaniu jak to masz musiałbyś łączyć to dla każdego QListWidgetItem jaki dodajesz. Lepiej jest wyłapywać sygnał kliknięcia na widoku i za jego pomocą wyłuskać z QModelIndex to który item został kliknięty.
  2. Okno musi dziedziczyć po QObject. Inaczej nie może korzystac z funkcji connect, nieprawdaż?

Ad1. sygnal kliknięcia na widoku ? to jaki to sygnał bo w mojej koncepcji zależy mi na tym, że sa wyświetlane elementy na liście i po 2xkliknięciu w niego otwiera się nam widget, który nam przekaże zawartośc tego elementu.

Ad2. w Qt pisze od tego właśnie projektu hobbistycznego, który sobie wymyśliłem. więc dzięki za info bo nie miałem zielonego pojęcia

SH
I jeszcze jedno tam w tej stronie na której się wzorowałem on to wywołuje w main ja wywołuje to w oknie ponieważ mój widget jest dzieckiem mojego okna no i tu się gubię :p
MA
Bywa. Sad story. Z czasem przyjdzie ogarnięcie i będziesz się zastanawiał - yyy... a co mnie to ruszało że okno tworzyłem gdzie indziej niż w mainie.
MA
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 10 lat
0

Oh. Wybacz. QListWidget nie ma tego sygnału o którym myślałem.
Twoja propozycja to:

Kopiuj
connect(ui->listWidget->itemDoubleClicked(), SIGNAL(doubleClicked(QModelIndex)),this, SIGNAL(on_listWidget_itemDoubleClicked())); 

Interesująca nas deklaracja funkcji connect to:

Kopiuj
ool 	connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) const 

Więc ja zaproponuję coś takiego dla 4 argumentów:

  1. Obiekt ktory może wysłać sygnał. Czyli QListWidget. W Twoim przypadku ui->listWidget.
  2. Sygnał który ten obiekt rzeczywiście może wyemitować. Sprawdzam tu http://qt-project.org/doc/qt-4.8/qlistwidget.html sekcja SIGNALS. Aha. SIGNAL(itemDoubleClicked ( QListWidgetItem *))
  3. Obiekt który ma odebrać sygnał. Twierdzisz, że to this. Ok. Jest to bardzo prawdopodobne, że to jest właściwe.
  4. Slot którym może zostać obsłużony sygnal a więc musi mieć takie same parametry jak sygnał. W związku z tym Twoja funkcja on_listWidget_itemDoubleClicked() nie może być bezparametrowa. Musi pobierać QListWidgetItem * item który przekazuje jej sygnał. Dlatego musisz to zmienić i se po tym działać w funkcji na tym itemie.

Także moim zdaniem connect będzie użyty tu w ten sposób:

Kopiuj
connect(ui->listWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem*)), this, SLOT(on_listWidget_itemDoubleClicked(QListWidgetItem*)))

Czyż nie tak?


Zero litości dla nieróbstwa.
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0
Malootki napisał(a):

Oh. Wybacz. QListWidget nie ma tego sygnału o którym myślałem.
Twoja propozycja to:

Kopiuj
connect(ui->listWidget->itemDoubleClicked(), SIGNAL(doubleClicked(QModelIndex)),this, SIGNAL(on_listWidget_itemDoubleClicked())); 

Interesująca nas deklaracja funkcji connect to:

Kopiuj
ool 	connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) const 

Więc ja zaproponuję coś takiego dla 4 argumentów:

  1. Obiekt ktory może wysłać sygnał. Czyli QListWidget. W Twoim przypadku ui->listWidget.
  2. Sygnał który ten obiekt rzeczywiście może wyemitować. Sprawdzam tu http://qt-project.org/doc/qt-4.8/qlistwidget.html sekcja SIGNALS. Aha. SIGNAL(itemDoubleClicked ( QListWidgetItem *))
  3. Obiekt który ma odebrać sygnał. Twierdzisz, że to this. Ok. Jest to bardzo prawdopodobne, że to jest właściwe.
  4. Slot którym może zostać obsłużony sygnal a więc musi mieć takie same parametry jak sygnał. W związku z tym Twoja funkcja on_listWidget_itemDoubleClicked() nie może być bezparametrowa. Musi pobierać QListWidgetItem * item który przekazuje jej sygnał. Dlatego musisz to zmienić i se po tym działać w funkcji na tym itemie.

Także moim zdaniem connect będzie użyty tu w ten sposób:

Kopiuj
connect(ui->listWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem*)), this, SLOT(on_listWidget_itemDoubleClicked(QListWidgetItem*)))

Czyż nie tak?

Ad1. zgodzę się
Ad2. This signal is emitted with the specified item when a mouse button is double clicked on an item in the widget. dokładnie o to mi chodzi według mnie taki ma być efekt.
Ad3. obik który odbiera sygnał "this" czyli nasze okno i po odebraniu sygnału emituje nam nasz powiązany tak ?
Ad4. Moja funkcja nigdy nie była bez parametrowa
cały czas wygląda tak:

Kopiuj
void okno::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{

    Elementy*o = new Elementy();

    QObject::connect(this, SIGNAL(tableNameEntered(const QString&)),
                         &o, SLOT(onNewTextEntered(const QString&)));

    emit this->tableNameEntered(item->text());

    o->show();
} 
SH
Ad4. cały czas przyjmuje parametr QListWidgetItem *item czyli potem pracujemy na Qlist albo QStringList coś w tym stylu , który jest tym konkretnym itemem posługując się wskaźnikiem na niego zgadza się ?
SH
A jeszcze jedno dodałem dziedziczenie po QObject, co dodatkowo Tworzy mi więcej błędów. A nie korzystniej było by zaincludować Qobject a nie po nim dziedziczyć ? i po prostu dowołać się do metody connect z QObject tak jak to robie powyżej ? Czy to nie o to chodzi i ja nie rozumiem ?
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0

problemy_1_jpg_300x300_q85.jpg

Taki najnowszy rzut błędów

MA
Pokaż cały kod. Podejrzenia mam ale nie chce mi się wróźyć na daremno
MA
Po co powracasz do wersji o której powiedziałem, że jest zła i nigdy nie będzie dobra?
SH
chciałem wiedziec dlaczego nie będzie dobra :) teraz już wiem bo mi powiedziałeś
MA
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 10 lat
0

Ad 3. Po odebraniu sygnału NIE EMITUJE, a wykonuje wskazaną przez nas funkcję :)
Ad 4. Dostajesz QListWidgetItem* item który kliknąłeś. Rób sobie z nim co chcesz. Korzystaj z czegokolwiek co z niego wyciągniesz.
Ad 5. Proszę bardzo. Spróbuj :P Kompilator będzie doskonale wiedział o jaką funkcję Ci chodzi - jeśli nie możesz nawet napisać QObject::connect. Możesz. Ale :) Teraz zaczynają się schody. Spróbuj zmusić funkcję która jako 1 i 3 parametr MUSI przyjmować wskażnik na QObject (lub, dzięki temu że to wskażnik to równie dobrze może przyjmować wkaźniki na obiekty klas dziedziczących z QObject) aby właśnie 3 parametr potrakował jakimś cudem jako QObject. Powodzenia :) Wydaje mi się, że kompilator jest na tyle uparty, że prędzej przekonasz rolnika żeby wydoił psa powtarzając mu 100 razy, że to jednak krowa.

Do wyjadaczy: Tak, może zmusić program do skompilowania się poprzez dynamic_cast lub reinterpreter_cast na wskaźniku ale przecież doskonale wiemy czym to się zakończy :)


Zero litości dla nieróbstwa.
SH
to dziedziczenie tak ? oky to zaraz zamieszczę błędy przy dziedziczeniu
MA
Btw. Obyś szybko rozwiązał problem :P Bo mimo, że problemy masz błache to ja już powoli czuję, że zabieram Ci możliwość rozwijania samodzielności a tego musisz się koniecznie nauczyć jako programista
SH
czegoś nie wiem, nie rozumiem to pytam. Pomożecie odpowiecie na pytania zrozumiem i sie nauczę
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0

problemy_2_jpg_300x300_q85.jpg

błache czy nie...
ale jeden błąd cały czas jest odnośnie nie pasującej funkcji do okno::conect(...
niepasująca ;/

MA
KODU JAK NIE BYŁO TAK I NIE MA !!! Poprawiam Ci coś. Wracasz do wersji błędnej. Proszę o kod. Dostaję błedy.
SH
już już kod całej klasy tak ?
SH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 6 lat
  • Postów:69
0
Kopiuj
 #ifndef OKNO_H
#define OKNO_H

#include <QMainWindow>
#include <QListWidgetItem>

namespace Ui {
    class okno;
}

class okno : public QMainWindow, QObject
{
    Q_OBJECT

public:
    explicit okno(QWidget *parent = 0);
    ~okno();

private slots:
    void on_actionNew_triggered();

    void on_actionExit_triggered();

    void on_actionSave_triggered();

    void on_pushButton_2_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_3_clicked();

    void on_actionOpen_triggered();

    void on_pushButton_7_clicked();

    void on_pushButton_8_clicked();

    void on_pushButton_9_clicked();

    void on_pushButton_6_clicked();

    void on_actionSerch_triggered();

    void on_actionAbout_Program_triggered();

    void on_pushButton_5_clicked();

    void on_listWidget_itemDoubleClicked(QListWidgetItem *item);

signals:

    void tableNameEntered(const QString &text);

private:
    Ui::okno *ui;
};

#endif // OKNO_H
Kopiuj
#include "okno.h"
#include "ui_okno.h"
#include "nowy.h"
#include "wyjscie.h"
#include "oprogramie.h"
#include "openerror.h"
#include "elementy.h"
#include <QDesktopWidget>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;

okno::okno(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::okno)
{
    ui->setupUi(this);
    //ustawienie nazwy Okna
    this->setWindowTitle("Kasia");
    //wyśrodkowanie okna
    QRect scr = QApplication::desktop()->screenGeometry(QApplication::desktop()->screenNumber());
    this->move(scr.center() - rect().center());
    //Ikona programu
    setWindowIcon(QIcon(":/icon.png"));

    connect(ui->listWidget, SIGNAL(itemDoubleClicked ( QListWidgetItem*)), this, SLOT(on_listWidget_itemDoubleClicked(QListWidgetItem*)));


    ui->widget->setVisible(true);
    ui->actionAdd_new_element->setDisabled(true);
    ui->actionClose->setDisabled(true);
    ui->actionSave->setDisabled(true);
    ui->actionOtions->setDisabled(true);
    ui->actionAdd_new_type->setDisabled(true);
    ui->actionSerch->setDisabled(true);
    ui->pushButton->setDisabled(true);
    ui->pushButton_5->setDisabled(true);
    ui->pushButton_6->setDisabled(true);

    fstream plik;
    string s;
    plik.open("tabela.kas",ios::in);
    s.clear();
    if( plik.good() == true )
    {
        while(!plik.eof())
        {
            getline(plik,s);
            QString qstr = QString::fromStdString(s);
            ui->listWidget->addItem(qstr);
            s.clear();
        }
    }
    else
    {
        plik.open("tabela.kas",ios::out | ios::out);
        plik <<"aa";
    }
    plik.close();

}

okno::~okno()
{
    delete ui;
}





//Kontrolka Nowy Plik
void okno::on_actionNew_triggered()
{
    nowy*o = new nowy();
    o->show();
}
//Kontrolka wyjścia z Pliku
void okno::on_actionExit_triggered()
{
    wyjscie*o = new wyjscie();
    o->show();


}
//Kontrolka zapisu do pliku
void okno::on_actionSave_triggered()
{
    //ZAPIS
    ui->pushButton->setEnabled(true);
    ui->pushButton_5->setEnabled(true);
    ui->pushButton_6->setEnabled(true);
}
//Potwierdzenie wyjscia bez zapisu
void okno::on_pushButton_2_clicked()
{
    exit(0);
}

void okno::on_pushButton_4_clicked()
{

}

void okno::on_pushButton_3_clicked()
{

}
//otwieranie pliku
void okno::on_actionOpen_triggered()
{
    //OPEN FILE
    ui->pushButton->setEnabled(true);
    ui->pushButton_5->setEnabled(true);
    ui->pushButton_6->setEnabled(true);
}

void okno::on_pushButton_7_clicked()
{
    //OKEY BUTTON
}
//Nowy plik (button)
void okno::on_pushButton_8_clicked()
{
    on_actionNew_triggered();
}
//Open File (button)
void okno::on_pushButton_9_clicked()
{
    on_actionOpen_triggered();
}

void okno::on_pushButton_6_clicked()
{
    on_actionSerch_triggered();
}

void okno::on_actionSerch_triggered()
{
    //SZUKAJ!!
}

void okno::on_actionAbout_Program_triggered()
{
    Oprogramie*o = new Oprogramie();
    o->show();
}

void okno::on_pushButton_5_clicked()
{
    OpenError*o = new OpenError();
    o->show();
}



void okno::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{

    Elementy*o = new Elementy();

    QObject::connect(this, SIGNAL(tableNameEntered(const QString&)),
                         &o, SLOT(onNewTextEntered(const QString&)));

    emit this->tableNameEntered(item->text());

    o->show();
}
 
MA
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 10 lat
1
  1. QMainWindow dziedziczy z QObject. Dziedzicząc z QMainWindow dziedziczysz też QObject. Zmień class okno : public QMainWindow, QObject na class okno : public QMainWindow
  2. Klasa Elementy tez musi w jakiś sposób dziedziczyć z QObject. To właśnie pokazuje Ci błąd... Od razu mówię, gdy to poprawisz pojawi się kolejny błąd. Ampersand przy o jest zdecydowanie niepotrzebny.

Zero litości dla nieróbstwa.
Zobacz pozostały 1 komentarz
SH
czyli w jakiś sposób dziedzicze po QObject tak ?
MA
Tak. Pytanie brzmi czy zrobiłeś to o co prosiłem? Usunąłeś ten ampersand? :((((
SH
I działa wszystko ładnie : )
SH
dzięki ::PPP
SH
napisałem Do Ciebie wiadomość
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)